代码之家  ›  专栏  ›  技术社区  ›  A O

是否可以有一个接受集合或数组并按(by:)排序调用的函数?

  •  1
  • A O  · 技术社区  · 6 年前

    我想写一个方法 Set Array 我是说,

    就像一个 Collection -一致性参数,或者类似的东西

    问题是看起来 sorted(by:) 存在于 阵列 水平,

    https://developer.apple.com/documentation/swift/set/2296160-sorted

    https://developer.apple.com/documentation/swift/array/2296815-sorted

    在它们都符合的任何协议中都没有声明。

    以下是我的排序方法:

    class func sortArray(_ array:[Bom]) -> [Bom] {  
    

    class func sortArray(_ array:Set<Bom>) -> [Bom] {
        return array.sorted {
            if $0.prop1 == $1.prop1 {
                if $0.prop2 == $1.prop2 {
                    if $0.prop3 == $1.prop3 {
                        return $0.prop4 ?? "" < $1.prop4 ?? ""
                    } else {
                        return $0.prop3 ?? "" < $1.prop3 ?? ""
                    }
                } else {
                    return $0.prop2 ?? "" < $1.prop2 ?? ""
                }
            } else {
                return $0.prop1 < $1.prop1
            }
        }
    }
    

    我可以复制粘贴此方法,并将参数类型从 [BOM] Set<Bom> 一切正常,但现在我有了一个文字复制粘贴函数,唯一的区别是参数类型…

    我是不是遗漏了一些简单的东西?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Rob Napier    6 年前

    sorted(by:) 存在于所有序列上。您的特定案例需要bom,因此您需要约束到:

    class func sortValues<S: Sequence>(_ values: S) -> [S.Element] where S.Element == Bom {
        // .. the rest of your method
    }
    

    你也可以约束到 Collection 是的。

    你也可以把这个扩展到 Sequence 收藏 物料清单:

    extension Sequence where Element == Bom {
        func sorted() -> [Bom] {
            return self.sorted {
                // .. the rest of your method
            }
        }
    }
    

    如果总是这样订购bom,您也可以考虑只生产bom Comparable ,然后所有常规排序方法都将在所有序列上工作:

    extension Bom: Comparable {
        static func < (lhs: Bom, rhs: Bom) -> Bool {
            if lhs.prop1 == rhs.prop1 {
                if lhs.prop2 == rhs.prop2 {
                    if lhs.prop3 == rhs.prop3 {
                        return lhs.prop4 ?? "" < rhs.prop4 ?? ""
                    } else {
                        return lhs.prop3 ?? "" < rhs.prop3 ?? ""
                    }
                } else {
                    return lhs.prop2 ?? "" < rhs.prop2 ?? ""
                }
            } else {
                return lhs.prop1 < rhs.prop1
            }
        }
    }