gpt4 book ai didi

swift - 为通用结构提供专门的初始化器

转载 作者:搜寻专家 更新时间:2023-10-31 22:59:51 25 4
gpt4 key购买 nike

我定义了一个简单的通用结构——它唯一的要求是它存储的属性是Comparable:

struct Bounds<A: Comparable> {
let lower: A
let upper: A
}

但是,我想为该结构提供几个专门的初始化程序,它们将使用一些数学运算来设置属性。

    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 )
}

结果显然应该是两个不同的结构,其中 A 是一个 Double 或一个 Measurement

但是我该怎么做呢?

我无法在定义中提供专门的 init 方法,因为编译器会提示 Double 不可转换为 A。好的...

我无法在受特定类型约束的单个扩展中提供 init 方法(where A == Double),因为编译器会提示:

Same-type requirement makes generic parameter 'A' non-generic

也许我应该使用 DoubleMeasurement 在初始化时都符合的协议(protocol),但这看起来很奇怪,因为 Bounds 结构应该只关心它们都符合 Comparable

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

最佳答案

不完全是您所要求的,而是一种可能的解决方法(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>

关于swift - 为通用结构提供专门的初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38224515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com