子类化Swift Double / Operator Overloading typealias

时间:2017-07-06 19:12:32

标签: swift types operator-overloading subclassing

我希望能够在我的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协议,但似乎没有帮助我。

1 个答案:

答案 0 :(得分:1)

虽然这是不可能的,但我前一段时间创建了一个类,它解决了类似的问题。我需要一个多价变量类,以便于货币字符串中的synthax,最后得到像波纹管这样的东西。到目前为止它工作得很好,而且我一直在使用它作为我从那时起建立的许多高级子类的迫击炮。它可以满足您的需求,如果您可以在Frequency子类中看到,则可以调整每个用例的init覆盖。 虽然课程很大,而且方法笨重,但您可以根据自己的需要进行调整和修改,或者如果您找到更简单的方法。我将它上传到这里的gist文件,以便于阅读。

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