Swift 调用 ExpressibleByStringLiteral 初始化器的可失败初始化器
Swift failable initializer calling ExpressibleByStringLiteral initializer
这是我在 swift 中遇到的最奇怪的问题,它让我疯狂地试图解决它。
我有一个名为 Algorithm
的结构,它符合 LosslessStringConvertible
,因此它有一个可失败的初始化。只是为了测试它,它总是 returns 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.
我一辈子都弄不明白为什么会这样。我正在调用一个初始值设定项,而另一个完全不同的是 运行.
知道为什么会这样吗?
谢谢!
此问题已在 SR-10259 and it seems this is expected behavior coming from Literal initialization via coercion (SE-0213)
中报告
可能的解决方法:
Algorithm.init("test") // don't coerce, call initializer
Algorithm(String("test")) // convert literal to a `String` first
这是我在 swift 中遇到的最奇怪的问题,它让我疯狂地试图解决它。
我有一个名为 Algorithm
的结构,它符合 LosslessStringConvertible
,因此它有一个可失败的初始化。只是为了测试它,它总是 returns 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.
我一辈子都弄不明白为什么会这样。我正在调用一个初始值设定项,而另一个完全不同的是 运行.
知道为什么会这样吗?
谢谢!
此问题已在 SR-10259 and it seems this is expected behavior coming from Literal initialization via coercion (SE-0213)
中报告可能的解决方法:
Algorithm.init("test") // don't coerce, call initializer
Algorithm(String("test")) // convert literal to a `String` first