摘自 iOs 10 编程基础:
“因为 Nest 采用 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 协议(protocol)深处的东西?
谢谢
最佳答案
这是编译器的魔法,所以不幸的是你不能自己声明这样的协议(protocol)。 :(
它与 ExpressibleByIntegerLiteral 的内部运作无关。编译器只会在左边看到一个 Nest 类型的变量,在右边看到一个整数文字。它认为,
Oh! The
Nesttype conforms toExpressibleByIntegerLiteral! And I see an integer literal. This means that I can change the integer literal toNest(integerLiteral: 5)!
就这么简单。对于其他 ExpressibleByXXXLiteral 协议(protocol)也是如此。
您不能声明自己的 ExpressibleByMyClass 协议(protocol),因为编译器不知道它。
关于ios - Swift ExpressibleByIntegerLiteral - 它究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40811343/