我希望能够在我的swift代码中使用一些自定义类型对Double进行子类化,以便稍后我可以进行内省和运算符重载。
这在语义上是我想要写的:
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是一种严格打字的语言。
我也查看过typealiases,但你不能用这些操作符重载。还看了一下FloatingPoint协议,但似乎没有帮助我。
答案 0 :(得分:1)
虽然这是不可能的,但我前一段时间创建了一个类,它解决了类似的问题。我需要一个多价变量类,以便于货币字符串中的synthax,最后得到像波纹管这样的东西。到目前为止它工作得很好,而且我一直在使用它作为我从那时起建立的许多高级子类的迫击炮。它可以满足您的需求,如果您可以在Frequency子类中看到,则可以调整每个用例的init
覆盖。
虽然课程很大,而且方法笨重,但您可以根据自己的需要进行调整和修改,或者如果您找到更简单的方法。我将它上传到这里的gist文件,以便于阅读。
当与您的用例一起使用时,它允许以下内容,这似乎是您想要的:
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