【发布时间】:2021-09-04 22:42:55
【问题描述】:
这是我在 swift 中遇到的最奇怪的问题,它让我疯狂地试图解决它。
我有一个名为Algorithm 的结构符合LosslessStringConvertible,因此它有一个可失败的初始化。只是为了测试它,它总是返回 nil:
init?(_ description: String) {
return nil
}
Algorithm也符合ExpressibleByStringLiteral,使用前面的init:
extension Algorithm: ExpressibleByStringLiteral {
init(stringLiteral value: String) {
self.init(value)!
}
}
但是当我从第一个 init 创建Algorithm 的实例时,我可以在 Xcode 中看到它不是可选的
let a = Algorithm("test")
a // a: Algorithm
然后我运行上面的代码,它在self.init(value)! 行崩溃,从ExpressibleByStringLiteral init 开始。
我一生都无法弄清楚为什么会发生这种情况。我正在调用一个初始化程序,并且正在运行一个完全不同的初始化程序。
任何想法为什么会发生这种情况?
谢谢!
【问题讨论】:
-
转载。有趣的是
Algorithm.init("test")或Algorithm(String("test"))将解决这个问题。我想这与编译器如何实现ExpressibleByStringLiteral有关。
标签: swift initialization