为通用结构提供专门的初始值设定项

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.

我觉得我要么错过了一些非常简单的东西,要么试图用泛型做一些真正被误导的事情。是哪一个,所以?

Mar*_*n R 1

不完全是你所要求的,但一个可能的解决方法(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)