Swift相当于MIN和MAX宏

mxb*_*mxb 92 generics swift

在C/Objective-C中,可以使用MIN和MAX宏找到两个数字之间的最小值和最大值.Swift不支持宏,似乎语言/库中没有等价物.每个人都应该有一个定制的解决方案,也许基于这样的仿制药进入一个?

Jac*_*ack 119

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
Run Code Online (Sandbox Code Playgroud)

在Swift中查看有关已记录和未记录的内置函数的精彩文章.

  • @GoZoner有时你只需要在Xcode中输入它并查看Swift标题.如果你输入`let a:Int = 5`和Command +点击`Int`,你会看到很酷的东西! (7认同)
  • 抱歉.你是怎么学到这个的?我没有在"Swift编程语言"中看到它,也没有在Xcode6文档搜索中看到它. (2认同)

Kyl*_*egg 34

正如所指出的,Swift提供max和min功能.

一个例子(为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
Run Code Online (Sandbox Code Playgroud)


Ima*_*tit 18

使用Swift,max(_:_:)它min(_:_:)是Swift标准库函数参考的一部分.

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

func max<T>(_ x: T, _ y: T) -> T where T : Comparable
Run Code Online (Sandbox Code Playgroud)

您可以像这样使用它Int:

let maxInt = max(5, 12) // returns 12
Run Code Online (Sandbox Code Playgroud)

有一个名为的第二个函数max(_:_:_:_:)允许您比较更多参数.min(_:_:_:_:)采用可变参数并具有以下声明:

func max<T>(_ x: T, _ y: T, _ z: T, _ rest: T...) -> T where T : Comparable
Run Code Online (Sandbox Code Playgroud)

您可以像这样使用它max(_:_:_:_:):

let maxInt = max(12.0, 18.5, 21, 26, 32.9, 19.1) // returns 32.9
Run Code Online (Sandbox Code Playgroud)

但是,对于Swift,你不仅限于使用Float,max(_:_:)而且与他们的Comparable同行一起使用String,Character或者class.实际上,这些函数是通用的,可以接受任何符合struct协议的参数类型,可能是Array,Set或者您的自定义Dictionary或Comparable.因此,以下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"
Run Code Online (Sandbox Code Playgroud)
func max<T>(_ x: T, _ y: T) -> T where T : Comparable
Run Code Online (Sandbox Code Playgroud)

此外,如果要获取max(_:_:)a,a min(_:_:),a max(_:_:)或任何其他序列内的元素的max元素,可以使用maxElement()或maxElement(_ :)方法.有关详细信息,请参阅此Stack Overflow答案.

  • 非常有帮助,谢谢!比上面的答案好得多,因为您实际上给出了一个用法示例,而不是一个神秘的标头。 (2认同)

wm.*_*1us 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
Run Code Online (Sandbox Code Playgroud)

和

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
Run Code Online (Sandbox Code Playgroud)

因此,当您使用它时,您应该像在此示例中一样编写:

let min = 0
let max = 100
let value = -1000

let currentValue = Swift.min(Swift.max(min, value), max)
Run Code Online (Sandbox Code Playgroud)

因此,如果低于0或高于100,则从0到100得到的值无关紧要.

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