如果我有结构...
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
.
与此同时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 }