2017-07-06 51 views
0

我希望能够在我的swift代码中使用一些自定义类型来继承Double类,以便稍后可以进行一些自省和运算符重载。Subclassing Swift Double/Operator Overload typealias

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

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 

感觉像什么,我要做的应该是更多钞票作为斯威夫特是一个严格的类型语言。

我也看了一下typealiases,但是你不能用那些操作符重载。也看了一下FloatingPoint协议,但似乎没有帮助我。

+1

'Double'是一个结构,它不能扩展。 – rmaddy

+0

@rmaddy不幸的不是。我想知道是否有不同的方法。也许协议? – freebie

回答

0

虽然这是不可能的,但是前段时间我创建了一个类,它解决了类似的问题。我需要一个多价变量类,以便于货币字符串中的合成词汇,最后以类似波纹的形式出现。到目前为止,它的工作非常棒,我从那以后一直用它作为许多先进子类的迫击炮。它做你想做的事情,如果你能在频率子类中看到,就变成为每个用例调整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