我想写一个采用Set
或Array
的方法,
类似于符合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>
,但一切正常,但是现在我有了一个文字复制粘贴功能,唯一的区别是参数类型。 ..
我在这里想念一些简单的东西吗?
答案 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的Sequence
或Collection
:
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
}
}
}