2016-11-25 128 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协议是斯威夫特协议“钩”到特殊的编译器的行为。如果没有编译器做了提升在后面,他们将无法做任何事。