取自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协议内部隐藏的内容吗?
由于
答案 0 :(得分:6)
它是编译器魔法,所以遗憾的是你不能自己声明这样的协议。 :(
它与ExpressibleByIntegerLiteral
的内部工作无关。编译器只在左侧看到类型Nest
的变量,在右侧看到整数文字。它认为,
哦!
Nest
类型符合ExpressibleByIntegerLiteral
!我看到一个整数字面值。这意味着我可以将整数文字更改为Nest(integerLiteral: 5)
!
就这么简单。对于其他ExpressibleByXXXLiteral
协议也是如此。
您无法声明自己的ExpressibleByMyClass
协议,因为编译器不知道它。
答案 1 :(得分:2)
ExpressibleBy*Literal
协议是Swift协议,用于“挂钩”特殊的编译器行为。如果没有编译器在后面进行提升,他们将无法做任何事情。