Generics 最小和最大宏的Swift等效值

Generics 最小和最大宏的Swift等效值,generics,swift,Generics,Swift,在C/Objective-C中,可以使用“最小”和“最大”宏找到两个数字之间的最小值和最大值。Swift不支持宏,并且似乎在语言/基础库中没有等价物。是否应该使用自定义解决方案,可能基于这样的泛型?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 func

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

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
func max(x:T,y:T,rest:T…)->T
函数min(x:T,y:T,rest:T…)->T

请参阅这篇伟大的文章。

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

示例(针对Swift 2.x更新)

使用Swift 5,并且是系统的一部分
max(::)
具有以下声明:

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

还请注意,还调用了其他函数,允许您比较更多的参数
max(::::)
具有以下声明:

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

但是,使用Swift时,您不仅限于使用
max(::)
及其同级数字。事实上,这些函数是泛型的,可以接受符合
Compariable
协议的任何参数类型,可以是
字符串
字符
,也可以是自定义的
结构

因此,以下示例代码可以完美地工作:

等级路线:可比、可转换{
让距离:Int
变量说明:字符串{
返回“有距离的路线:\(距离)”
}
初始(距离:Int){
self.distance=距离
}
静态函数==(左:路线,右:路线)->Bool{
返回左侧距离==右侧距离
}
静态函数布尔{
返回左侧距离<右侧距离
}
}
让路线1=路线(距离:4)
让路线2=路线(距离:8)
设maxRoute=max(路由1,路由2)
打印(maxRoute)//打印“距离为8的路线”

此外,如果要获取
数组
集合
字典
或任何其他
可比
元素序列中元素的最小/最大元素,可以使用或方法(有关更多详细信息,请参阅)。

尝试此操作

    let numbers = [2, 3, 10, 9, 14, 6]  
    print("Max = \(numbers.maxElement()) Min = \(numbers.minElement())")
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

所以你得到的值是从0到100,不管它是低于0还是高于100。

对不起。你是怎么知道的?我在“Swift编程语言”和Xcode6文档搜索中都没有看到它。@GoZoner有时你只需要在Xcode中键入它,然后查看Swift标题。如果您键入
let a:Int=5
并在Command+上单击
Int
,您将看到很酷的东西!哇,很高兴我问了!充其量我一直在键入
a.
并滚动Xcode完成可能性。。。但“命令+点击”才是关键@GoZoner Autocomplete也是一个搜索的好地方!不幸的是,目前Xcode 6非常不稳定…@GoZoner Int()的值为0,因此如果您的数字为负数,这将不起作用,您可以将maxNumber设置为可选,并将for循环替换为:numbers.forEach{maxNumber=maxNumber!=nil?max(maxNumber!,$0):$0}如果您在Xcode 9中遇到了一个有趣的编译器错误,就像我一样,说max()不存在,即使你清楚地把它传递了两个
Int
s,然后把它改成Swift.max,突然之间,事情就好了。谢谢我们!非常有帮助,谢谢!比上面的答案要好得多,因为您实际上给出了一个用法示例,而不是一个神秘的标题。
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)