2016-12-15 33 views
1

如果我有一個結構體,我可以實現ExpressibleByIntegerLiteral以從整數文字中隱式創建它的實例。隱式強制轉換爲原語

struct MyStruct: ExpressibleByIntegerLiteral { 
    let value: Int 

    init(integerLiteral value: Int) { 
     self.value = value 
    } 
} 


let a: MyStruct = 1 

尼斯。

有沒有辦法做相反的事,即從MyStruct隱含轉換爲Int

我知道,我可以實現在Int擴展的init方法來獲得明確的鑄造工作,像這樣:

extension Int { 
    init(_ myStruct: MyStruct) { 
     self = myStruct.value 
    } 
} 


let b = Int(a) 

但有什麼我可以做的就是這一行編譯:

let c: Int = a 
+0

見http://stackoverflow.com/questions/24645798 /不,迅速支持隱式轉換 – courteouselk

回答

1

做,在一個行,最好的辦法是選擇價值屬性:

let c: Int = a.value 

因爲你不能重載「=」你可以檢查出:

struct MyStruct: ExpressibleByIntegerLiteral { 
    let value: Int 

    init(integerLiteral value: Int) { 
     self.value = value 
    } 
} 


func += (inout left: Int, right: MyStruct) { 
    left = right.value 
} 


let a: MyStruct = 1; 
var c:Int = 0; 
c += a 

否則,您必須創建自定義ExpressibleBy 結構文字

相關問題