在Swift中扩展通用整数类型

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似乎无法扩展协议.

那么,是否有更合适的地方可以放置我的扩展程序?

Rob*_*ier 7

对于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要好得多.


And*_*huk 5

虽然 Swift 2.0 仍处于测试阶段,但我建议您添加如图所示的扩展。您必须复制粘贴相同的代码等IntInt64但目前没有其他方法可以完成您想要的操作。

一旦 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()可用于其他类型,例如DoubleFloat

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)