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