Swift ExpressibleByIntegerLiteral - 它究竟是如何工作的?

use*_*499 3 protocols ios swift

摘自iOs 10编程基础知识:

"因为Nest采用了​​ExpressibleByIntegerLiteral,我们可以传递一个需要嵌套的Int,我们的init(integerLiteral :)将被称为AUTOMATICALLY ....."

struct Nest : ExpressibleByIntegerLiteral {
     var eggCount : Int = 0
     init() {}
     init(integerLiteral val: Int) {
          self.eggCount = val
     }
}
Run Code Online (Sandbox Code Playgroud)

好吧所以我的问题是这个......它是如何被自动调用的?当我试图找出原因时,我的逻辑陷入了困境.从我看到的,你可以说:

var eggie : Nest = 5
Run Code Online (Sandbox Code Playgroud)

但是......好吧,等号后的数字5实际上是一个简写的逻辑在哪里:

var eggie : Nest = Nest(5)
Run Code Online (Sandbox Code Playgroud)

AKA初始化新实例的"标准"方式......

这只是处理该转换的ExpressibleByIntegerLiteral协议内部隐藏的东西吗?

谢谢

Swe*_*per 6

它是编译器的魔力,所以很遗憾你不能自己声明这样的协议.:(

它与内部运作无关ExpressibleByIntegerLiteral.编译器只Nest在左侧看到一个类型的变量,在右侧看到一个整数文字.它认为,

哦! 该Nest类型符合ExpressibleByIntegerLiteral!我看到一个整数字面值.这意味着我可以将整数文字更改为Nest(integerLiteral: 5)!

就这么简单.其他ExpressibleByXXXLiteral协议也是如此.

您无法声明自己的ExpressibleByMyClass协议,因为编译器不知道它.