Swift相当于MIN和MAX宏

时间:2014-06-12 14:13:34

标签: generics swift

在C / Objective-C中,可以使用MIN和MAX宏找到两个数字之间的最小值和最大值。 Swift不支持宏,似乎语言/基础库中没有等价物。应该使用自定义解决方案,可能基于这样的泛型one

5 个答案:

答案 0 :(得分:118)

minmax已在Swift中定义:

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

documented & undocumented built-in functions in Swift上查看这篇精彩的文章。

答案 1 :(得分:34)

正如所指出的,Swift提供maxmin函数。

一个例子(为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

答案 2 :(得分:17)

使用Swift,minmaxSwift Standard Library Functions Reference的一部分。

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

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

你可以像Int一样使用它:

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

还有一个名为max(_:_:_:_:)的第二个函数,可让您比较更多参数。 max(_:_:_:_:)需要variadic parameter并具有以下声明:

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对等人IntFloat或{ {1}}。实际上,这些函数是通用的,可以接受符合Double协议的任何参数类型,可能是ComparableString或您的一个自定义Character或{{ 1}}。因此,以下Playground代码可以完美地运行:

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或任何其他序列中元素的最大元素,您可以使用{{3 }或maxElement()方法。有关详细信息,请参阅maxElement(_:)

答案 3 :(得分:13)

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得到的值无关紧要。

答案 4 :(得分:0)

试试这个。

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