2017-07-06 98 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