我有一个泛型类,其中类中的泛型值始终为“数字”(它们始终为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))
}
但是,编译器不喜欢这个...有没有办法表示泛型类型是'向下浇注'到另一种类型?
答案 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,您还可以制作协议扩展程序并添加其他初始化程序要求,以便省略init
,Int
和{{1}中的Float
声明}} extension:
Double