Generics 最小和最大宏的Swift等效值
在C/Objective-C中,可以使用“最小”和“最大”宏找到两个数字之间的最小值和最大值。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
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)