【问题标题】:Swift equivalent for MIN and MAX macrosMIN 和 MAX 宏的 Swift 等效项
【发布时间】:2014-06-12 14:13:34
【问题描述】:

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

【问题讨论】:

    标签: generics swift


    【解决方案1】:

    minmax 在 Swift 中定义:

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

    并像这样使用:

    let min = min(1, 2)
    let max = max(1, 2)
    

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

    【讨论】:

    • 对不起。你是怎么学的?我在“Swift 编程语言”和 Xcode6 文档搜索中都没有看到它。
    • @GoZoner 有时您只需要在 Xcode 中输入它并查看 Swift 标头即可。如果你输入let a : Int = 5 并Command + 点击Int,你会看到很酷的东西!
    • 哇,很高兴我问了!充其量我一直在输入 a. 并滚动浏览 Xcode 完成的可能性......但“Command + Click”是票!
    • @GoZoner Autocomplete 也是一个搜索的好地方!不幸的是,目前它对于 Xcode 6 来说非常不稳定......
    • 代码 sn-p 包含很多噪音( ? rest: T... ? 这些是什么意思?)并没有真正解释如何使用该功能。有一行代码实际显示其用途会更有帮助。
    【解决方案2】:

    如前所述,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,所以如果你的数字是负数,这将不起作用
    • 您可以将 maxNumber 设为可选并将 for 循环替换为: numbers.forEach{maxNumber = maxNumber != nil ?最大值(最大值!,$0):$0}
    【解决方案3】:

    对于 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 协议的参数类型,可以是StringCharacter 或您自定义的classstruct 之一。

    因此,以下 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"
    

    此外,如果您想获取 ArraySetDictionary 或任何其他 Comparable 元素序列中的元素的最小/最大元素,您可以使用 @987654326 @ 或 min() 方法(有关详细信息,请参阅 this Stack Overflow answer)。

    【讨论】:

    • 非常有帮助,谢谢!比上面的答案要好得多,因为您实际上给出了一个用法示例,而不是一个神秘的标题。
    【解决方案4】:

    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。

    【讨论】:

    • 如果你像我一样在 XCode 9 中遇到一个有趣的编译器错误,说即使你清楚地传递了两个 Ints,max() 也不存在,然后将其更改为 Swift。麦克斯和突然耶,事情变得更好了。感谢 wm.p1us!
    【解决方案5】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多