MIN 和 MAX 宏的 Swift 等效项

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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.forEachmaxNumber = 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)")

【讨论】:

以上是关于MIN 和 MAX 宏的 Swift 等效项的主要内容,如果未能解决你的问题,请参考以下文章

MAKEWORD c++ Windows 宏的 C# 等效项是啥?

swi.nii 图像(医学图像)中的 3d numpy 数组中的 Np.min

在 Django 中使用 mysql 查询或等效项

@protocol(DelegateType) 的 Swift 等效项

Swift 中的 cURL 等效项 - iOS

Swift 中的 Android setTag 等效项