用于MIN和MAXmacros的Swift等价物
在C / Objective-C中,使用MIN和MAXmacros可以find两个数字之间的最小值和最大值。 Swift不支持macros,似乎在语言/基础库中没有等价物。 是否应该使用自定义解决scheme,也许基于这样的generics?
在Swift中已经定义了min
和max
:
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提供了max
和min
function。
一个例子(更新了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, min
和max
是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
对应项,包括Int
, Float
或Double
。 实际上,这些函数是generics的,可以接受任何符合Comparable
协议的参数types,可以是String
, Character
,也可以是您的自定义class
或struct
。 因此,下面的游乐场代码完美地工作:
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())")