2016-11-25 124 views
2

從IOS 10編程基礎摘自:斯威夫特ExpressibleByIntegerLiteral - 究竟是如何工作的呢?

「因爲鳥巢採用ExpressibleByIntegerLiteral,我們可以通過一個Int其中一個窩的預期,而我們的init(integerLiteral :)將被自動調用.....」

struct Nest : ExpressibleByIntegerLiteral { 
    var eggCount : Int = 0 
    init() {} 
    init(integerLiteral val: Int) { 
      self.eggCount = val 
    } 
} 

好了,所以我的問題是這樣的...它是怎樣到達自動調用雖然??當我試圖弄清楚爲什麼時,我的邏輯碰到了一堵磚牆。從我所看到的,你可以說:

var eggie : Nest = 5 

但是......好吧哪裏是在等號後面的數字5是如何實際上是一個速記的邏輯:

var eggie : Nest = Nest(5) 

又名「初始化一個新的實例的標準」的方式......

是不是隻是一些深藏的ExpressibleByIntegerLiteral協議,正在處理這一轉變裏面?

感謝

+3

的* *編譯器變換'變種eggie:巢= 5'到'VAR eggie =巢(integerLiteral:5)' –

回答

3

這是編譯魔術,很遺憾你不能自己聲明這樣的協議。 :(

它無關的ExpressibleByIntegerLiteral的內部工作,編譯器只看到在左邊和右邊的文字整數Nest類型的變量,它認爲,

哦!該Nest類型符合ExpressibleByIntegerLiteral!我看到一個整數文字,這意味着我可以改變整數文字到Nest(integerLiteral: 5)

就這麼簡單。這也是其他ExpressibleByXXXLiteral協議如此。

你不能聲明自己ExpressibleByMyClass協議,因爲編譯器不知道這件事。

1

ExpressibleBy*Literal協議是斯威夫特協議「鉤」到特殊的編譯器的行爲。如果沒有編譯器做了提升在後面,他們將無法做任何事。