gpt4 book ai didi

swift - 子类化 Swift double /运算符重载类型别名

转载 作者:行者123 更新时间:2023-11-28 06:16:39 25 4
gpt4 key购买 nike

我希望能够在我的 swift 代码中使用一些自定义类型对 Double 进行子类化,以便稍后进行一些自省(introspection)和运算符重载。

这在语义上是我希望能够写的:

class Frequency: Double {}

class Period: Double {
init(_ frequency: Frequency) {
let period: Double = 1 / frequency
self.init(period)
}
}


let a = Double(1)
print(type(of: a)) // Double

let b = Frequency(2)
print(type(of: b)) // Frequency

let c = Period(a)
print(type(of: c)) // Period == 1

let d = Period(b)
print(type(of: d)) // Period == 0.5

感觉我正在尝试做的事情应该是可行的,因为 Swift 是一种严格类型化的语言。

我也看过类型别名,但你不能用它们来重载运算符。还查看了 FloatingPoint 协议(protocol),但似乎对我没有帮助。

最佳答案

虽然这是不可能的,但我刚才创建了一个类,它解决了类似的问题。我需要一个多价变量类,以便于货币字符串中的 synthax,并最终得到类似下面的东西。到目前为止,它运行良好,我一直将它用作我从那时起构建的许多高级子类的迫击炮。它做你想做的事,如果你能在 Frequency 子类中看到,这就变成了为每个用例调整 init 重写的问题。虽然类很大,方法也很庞大,但您可以随意调整和修改您认为合适的方式,或者如果您找到更简单的方法。我将其上传到此处的要点文件,以便于阅读。

Link to the class.

当与您的用例一起使用时,它允许执行以下操作,这似乎是您想要的:

class Frequency : MultiVar {
override init(_ value: Any?) {
super.init(value)
let current = double
guard current != 0.0 else {
print("Frequency Error: Something went wrong while subclassing \(self), established variable 'double' is equal to 0!")
return
}
double = 1 / current
}
}

let freq = Frequency(10)
print(freq.string) //prints 0.1
print(freq.double) //prints 0.1

关于swift - 子类化 Swift double /运算符重载类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44957112/

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