用于MIN和MAXmacros的Swift等价物

在C / Objective-C中,使用MIN和MAXmacros可以find两个数字之间的最小值和最大值。 Swift不支持macros,似乎在语言/基础库中没有等价物。 是否应该使用自定义解决scheme,也许基于这样的generics?

在Swift中已经定义了minmax

 func max<T : Comparable>(x: T, y: T, rest: T...) -> T func min<T : Comparable>(x: T, y: T, rest: T...) -> T 

在Swift中查看关于logging和未logging的内置函数的很好的文章 。

正如指出的,Swift提供了maxminfunction。

一个例子(更新了Swift 2.x)。

 let numbers = [ 1, 42, 5, 21 ] var maxNumber = Int() for number in numbers { maxNumber = max(maxNumber, number as Int) } print("the max number is \(maxNumber)") // will be 42 

使用Swift, minmax是Swift标准库函数参考的一部分 。

max(_:_:)具有以下声明:

 func max<T : Comparable>(_ x: T, _ y: T) -> T 

你可以像Int一样使用它:

 let maxInt = max(5, 12) // returns 12 

还有第二个函数叫做max(_:_:_:_:) ,它允许你比较更多的参数。 max(_:_:_:_:)接受可变参数并具有以下声明:

 func max<T : Comparable>(_ x: T, _ y: T, _ z: T, _ rest: T...) -> T 

你可以像Float一样使用它:

 let maxInt = max(12.0, 18.5, 21, 15, 26, 32.9, 19.1) // returns 32.9 

但是,使用Swift,您不仅限于使用max(_:_:)max(_:_:_:_:)和它们的min对应项,包括IntFloatDouble 。 实际上,这些函数是generics的,可以接受任何符合Comparable协议的参数types,可以是StringCharacter ,也可以是您的自定义classstruct 。 因此,下面的游乐场代码完美地工作:

 let maxString = max("Car", "Boat") // returns "Car" (alphabetical order) 
 class Route: Comparable, CustomStringConvertible { let distance: Int var description: String { return "Route with distance: \(distance)" } init(distance: Int) { self.distance = distance } } func ==(lhs: Route, rhs: Route) -> Bool { return lhs.distance == rhs.distance } func <(lhs: Route, rhs: Route) -> Bool { return lhs.distance < rhs.distance } let route1 = Route(distance: 4) let route2 = Route(distance: 8) let maxRoute = max(route1, route2) print(maxRoute) // prints "Route with distance: 8" 

此外,如果您想要获取Array ,元素的最大元素,可以使用maxElement()或maxElement(_ :)方法。 有关更多详细信息,请参阅Stack Overflow答案 。

SWIFT 4语法发生了一些变化:

 public func max<T>(_ x: T, _ y: T) -> T where T : Comparable public func min<T>(_ x: T, _ y: T) -> T where T : Comparable 

 public func max<T>(_ x: T, _ y: T, _ z: T, _ rest: T...) -> T where T : Comparable public func min<T>(_ x: T, _ y: T, _ z: T, _ rest: T...) -> T where T : Comparable 

所以当你使用它时,你应该像这个例子一样写:

 let min = 0 let max = 100 let value = -1000 let currentValue = Swift.min(Swift.max(min, value), max) 

所以你得到的值从0到100不要紧,如果它低于0或更高100。

尝试这个。

  let numbers = [2, 3, 10, 9, 14, 6] print("Max = \(numbers.maxElement()) Min = \(numbers.minElement())")