Zoë*_*ith 5 generics struct swift
我定义了一个简单的通用结构 - 它唯一的要求是它存储的属性是Comparable:
struct Bounds<A: Comparable> {
let lower: A
let upper: A
}
Run Code Online (Sandbox Code Playgroud)
但是,我想为该结构提供几个专门的初始值设定项,它们将使用一些数学运算来设置属性。
init(value: Double, tolerance: Percentage) {
self.lower = value * ( 1 - tolerance )
self.upper = value * ( 1 + tolerance )
}
init(value: Measurement, tolerance: Percentage) {
self.lower = value.value * ( 1 - tolerance )
self.lower = value.value * ( 1 - tolerance )
}
Run Code Online (Sandbox Code Playgroud)
结果显然应该是两个不同的结构,其中 A 是 aDouble或 a Measurement。
但我该怎么做呢?
我无法在定义中提供专门的 init 方法,因为编译器会抱怨Double is not convertible to A. 好的...
where A == Double正如编译器抱怨的那样,我无法在受特定类型 ( ) 约束的各个扩展中提供 init 方法:
相同类型的要求使得泛型参数“A”成为非泛型
也许我应该使用一个在初始化时Double和都Measurement符合的协议,但这看起来很奇怪,因为Bounds结构应该只关心它们都符合Comparable.
我觉得我要么错过了一些非常简单的东西,要么试图用泛型做一些真正被误导的事情。是哪一个,所以?
不完全是你所要求的,但一个可能的解决方法(Swift 3):
extension Bounds where A: FloatingPoint {
init(value: A, tolerance: A) {
self.lower = value * ( A(1) - tolerance )
self.upper = value * ( A(1) + tolerance )
}
}
let b = Bounds(value: 4.0, tolerance: 0.1)
print(b.dynamicType) // Bounds<Double>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
871 次 |
| 最近记录: |