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

时间:2016-11-25 19:31:57

标签: ios swift protocols

取自iOs 10编程基础:

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

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)

AKA'标准'初始化新实例的方法......

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

由于

2 个答案:

答案 0 :(得分:6)

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

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

  

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

就这么简单。对于其他ExpressibleByXXXLiteral协议也是如此。

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

答案 1 :(得分:2)

ExpressibleBy*Literal协议是Swift协议,用于“挂钩”特殊的编译器行为。如果没有编译器在后面进行提升,他们将无法做任何事情。