2016-08-25 49 views
4

我喜歡C#的一件事是你可以爲你的類定義隱式轉換器。例如,我創建了一個VectorGeometryBuilder類,它具有類似於MoveForwardByX,TurnByYDegrees,LineToPoint等的方法。然後它定義了對類的隱式轉換。這使我能夠用我的漂亮生成器來創建我的幾何體,然後只是通過整個套件正堆一起到任何函數期待一個Geometry,即使VectorGeometryBuilder本身Geometry.一個子類,相反,它暴露了一個Geometry對象一個屬性,隱式轉換器抓取並返回。在Swift中可以爲你的類類型創建隱式轉換嗎?

我想知道的是,如果Swift有類似的東西。

考慮這個虛構的場景......

class FauxInt 
{ 
    init(_ initialValue:Int) 
    { 
     value = initialValue 
    } 
    var value:Int 
} 

let fauxInt = FauxInt(14) 

這些都是樣的東西,我想能夠做到......

let realInt:Int = fauxInt 

someFuncTakingAnInt(someInt:fauxInt) 

再次,轉換Int應該是隱含的含義,在任何期待Int的地方,我可以使用或通過FauxInt來代替。

有什麼辦法可以使上述可能?

回答

5

Swift不支持隱式轉換 - 最接近的等價物是通過額外的構造函數完成的。所以,一個雙轉換爲int:

let i: Int = Int(myDouble) 

在你的情況,你可以定義的擴展,INT創建需要fauxInit作爲參數的新的init:

extension Int { 
    init(_ myFaux: FauxInt) { 
     self = myFaux.value 
    } 
} 

let fauxInt = FauxInt(14) 
let realInt = Int(fauxInt) 
+0

呀,不太相同。雖然我很欣賞可以在這裏做什麼,如果你正在「轉換」一個新的初始化器的對象已經公開了一個int屬性,最有可能代替這個... someFuncTakingInt(Int(fauxInt))...我會可能只是寫這個... someFuncTakingInt(fauxInt.value)。換句話說,沒有隱式轉換的能力,至少在這種情況下,這確實不會增加太多。不過,投票你,因爲在其他情況下,這將是一個非常有用的提示,並遵循Swift標準。 – MarqueIV

相關問題