指示一个' castable' Swift中的泛型类型

时间:2015-03-15 03:40:47

标签: swift generics

我有一个泛型类,其中类中的泛型值始终为“数字”(它们始终为Int s,Float s或Double s。)这些值需要在浮点精度很重要的某些计算中使用:

protocol Numeric {
    func -(lhs: Self, rhs: Self) -> Self
}

func pointAtPercentageOfRange<T where T: Numeric>(min: T, max: T, percentage: Double) -> Double {
    let range = max - min
    return min + (percentage * CGFloat(range))
}

但是,编译器不喜欢这个...有没有办法表示泛型类型是'向下浇注'到另一种类型?

1 个答案:

答案 0 :(得分:0)

在这种情况下,我会将公共表示定义为Double,并将初始化程序定义为Numeric类型:

protocol Numeric {
    init(_ value : Numeric)
    var doubleValue: Double { get }

    // define some operators
    ...
}

// make Int, Float and Double conform to it
extension Int: Numeric {
    var doubleValue: Double { return Double(self) }
    init(_ value: Numeric) { self.init(value.doubleValue) }
}

extension Float: Numeric {
    var doubleValue: Double { return Double(self) }
    init(_ value: Numeric) { self.init(value.doubleValue) }
}

extension Double: Numeric {
    var doubleValue: Double { return self }
    init(_ value: Numeric) { self.init(value.doubleValue) }
}

// easy "casting" / converting from any Numeric type
let num: Numeric = 5.9
Int(num)
Float(num)
Double(num)

如果您使用的是Swift 2,您还可以制作协议扩展程序并添加其他初始化程序要求,以便省略initInt和{{1}中的Float声明}} extension:

Double