是否有可能使用Set或Array并调用sorted(by :)的函数?

时间:2018-06-26 00:41:39

标签: swift collections

我想写一个采用SetArray的方法,

类似于符合Collection的参数,或类似的

问题在于sorted(by:)Set级别上似乎存在Array

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 个答案:

答案 0 :(得分:2)

sorted(by:)存在于所有序列上。您的具体情况需要Bom,因此您需要对此加以限制:

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

您还可以限制为Collection

您还可以将其扩展为Bom的SequenceCollection

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

如果这始终是Boms排序的方式,则您也可以考虑将其设置为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
        }
    }
}