MIN和MAX宏的Swift等效项


97

在C / Objective-C中,可以使用MIN和MAX宏在两个数字之间找到最小值和最大值。Swift不支持宏,并且语言/基本库中似乎没有等效项。如果一个去同一个定制的解决方案,也许基于这样的泛型一个

Answers:


124

min并且max已经在Swift中定义:

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

请参阅有关Swift中已记录和未记录的内置函数的精彩文章


2
抱歉。你是怎么学到的?我在“ The Swift Programming Language”和Xcode6文档搜索中都没有看到它。
GoZoner 2014年

7
@GoZoner有时您只需要在Xcode中键入它并签出Swift标头即可。如果您键入let a : Int = 5并按Command +单击Int,那么您会看到很棒的东西!
杰克

哇,很高兴我问!充其量我一直在打字a.和滚动浏览Xcode的完成可能性……但是“ Command + Click”才是票证!
GoZoner 2014年

1
@GoZoner Autocomplete也是搜索的好地方!不幸的是,目前它对Xcode 6非常不了解...
Jack


36

如前所述,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

Int()的值为0,因此,如果您的数字为负,则此方法将无效
eonist

1
您可以将maxNumber设为可选,并将for循环替换为:numbers.forEach {maxNumber = maxNumber!= nil?max(maxNumber!,$ 0):$ 0}
eonist

18

使用Swift 5,max(_:_:)并且min(_:_:)Global Numeric Functions的一部分max(_:_:)具有以下声明:

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

您可以将其与Ints一起使用:

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

另请注意,还有其他调用的函数max(_:_:_:_:)min(_:_:_:_:)它们使您可以比较更多参数。max(_:_:_:_:)具有以下声明:

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

您可以将其与Floats一起使用:

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

但是,使用Swift时,您不仅可以使用max(_:_:)数字及其同级符号。实际上,这些函数是通用的,可以接受符合Comparable协议的任何参数类型,可以是String,也可以Character是您的自定义class或中的一种struct

因此,以下Playground示例代码可以完美运行:

class Route: Comparable, CustomStringConvertible {

    let distance: Int
    var description: String {
        return "Route with distance: \(distance)"
    }

    init(distance: Int) {
        self.distance = distance
    }

    static func ==(lhs: Route, rhs: Route) -> Bool {
        return lhs.distance == rhs.distance
    }

    static 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,a Set,a Dictionary或任何其他Comparable元素序列内的元素的min / max元素,则可以使用max()min()方法(有关更多信息,请参见此Stack Overflow答案)细节)。


1
非常有帮助,谢谢!因为您实际上给出了用法示例,而不是一个神秘的标头,所以它比上面的答案要好得多。
Cindeselia '18

14

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。


2
如果像我这样在XCode 9中遇到一个有趣的编译器错误,即说即使您清楚地将max()传递了2 Ints,也不存在max(),然后将其更改为Swift.max,然后突然变好了,情况会更好。谢谢wm.p1us!
xaphod

0

试试这个。

    let numbers = [2, 3, 10, 9, 14, 6]  
    print("Max = \(numbers.maxElement()) Min = \(numbers.minElement())")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.