如果我有结构......
struct MyStruct {
let number: Int
}
我有一系列的......
var array = [MyStruct]()
// populate array with MyStructs
然后我可以这样做以获得最大number
...
var maxNumber = 0
for tempStruct in array where tempStruct.number > maxNumber {
maxNumber = tempStruct.number
}
但是,我不能使用......
let maxStruct = array.maxElement()
因为MyStruct
无法比较。我可以使它具有可比性但是我可能还有一个我要比较的日期戳,因此使它可比较并不理想。
我还能采用另一种更优雅的方式吗?
...
我只是想,我也可以这样做......
let maxStruct = array.sort{$0.number > $1.number}.first()
但这需要更多时间。我不确定它使用哪种排序方法,但它可能是n log(n)
,而我的初始方法只是n
。
答案 0 :(得分:6)
与sort()/sortInPlace()
一样,min/maxElement()
也有两种变体:第一种
要求序列元素具有可比性:
extension SequenceType where Generator.Element : Comparable {
public func minElement() -> Self.Generator.Element?
public func maxElement() -> Self.Generator.Element?
}
第二个没有这样的限制并采取比较器 作为参数而不是:
extension SequenceType {
public func minElement(@noescape isOrderedBefore: (Self.Generator.Element, Self.Generator.Element) throws -> Bool) rethrows -> Self.Generator.Element?
public func maxElement(@noescape isOrderedBefore: (Self.Generator.Element, Self.Generator.Element) throws -> Bool) rethrows -> Self.Generator.Element?
}
在您的情况下,您可以将maxElement()
与比较器功能一起使用:
// Swift 2:
let maxStruct = array.maxElement { $0.number < $1.number }
// Swift 3:
let maxStruct = array.max { $0.number < $1.number }