Har*_*ikk 9 protocols swift swift2 protocol-extension
所以我试图用一些方便的函数来扩展Swift的整数类型,但是我还不清楚我应该扩展哪些协议.
作为一个例子,假设我想实现一个用于钳位值的函数(如果它小于最小值,则将其设置为该值,否则如果它大于最大值则将其设置为该值).我的第一个想法是做这样的事情:
extension Int {
func clamp(minimum:Int, maximum:Int) {
if self < minimum { return minimum }
if self > maximum { return maximum }
return self
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子,但它说明了问题; 如果我现在想要调用它,UInt那么我自然也不能,所以我必须添加一个等价物UInt,但这对于UInt16等等不适用.
我认为我可以在链上向上扩展一些东西,然后使用泛型,但是IntegerType似乎无法扩展协议.
那么,是否有更合适的地方可以放置我的扩展程序?
对于Swift 2,请参阅Andriy Gordiychuk的回答,这将是正确的.如果你需要Swift 1,那么这不能用扩展来完成,而且必须用免费功能来完成.这就是为什么stdlib中有如此多的自由函数成为Swift 2中的扩展.
对于Swift 1,您需要做的是:
func clamp<T:Comparable>(value: T, #minimum:T, #maximum:T) -> T {
if value < minimum { return minimum }
if value > maximum { return maximum }
return value
}
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢修改该值(如Andriy的示例所示),您可以这样做:
func clamp<T:Comparable>(inout value: T, #minimum:T, #maximum:T) {
if value < minimum { value = minimum }
else if value > maximum { value = maximum }
}
Run Code Online (Sandbox Code Playgroud)
否则你必须在每种类型上写一个扩展名.这是Swift 1中唯一的其他答案.Swift 2要好得多.
虽然 Swift 2.0 仍处于测试阶段,但我建议您添加如图所示的扩展。您必须复制粘贴相同的代码等Int,Int64但目前没有其他方法可以完成您想要的操作。
一旦 Swift 2.0 发布,您将能够做到这一点
extension IntegerType {
mutating func clamp(minimum:Self, maximum:Self) {
if self < minimum { self = minimum }
if self > maximum { self = maximum }
}
}
Run Code Online (Sandbox Code Playgroud)
如果您可以等到 9 月份的某个时候发布您的应用程序,那么我鼓励您立即开始使用 Swift 2.0。
Comparable使用 Swift 2.0,您还可以向协议添加扩展,这将确保clamp()可用于其他类型,例如Double、Float等
extension Comparable {
mutating func clamp(minimum:Self, maximum:Self) {
if self < minimum { self = minimum }
if self > maximum { self = maximum }
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1894 次 |
| 最近记录: |