【问题标题】:Swift failable initializer calling ExpressibleByStringLiteral initializer调用 ExpressibleByStringLiteral 初始化程序的 Swift 可失败初始化程序
【发布时间】: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


【解决方案1】:

SR-10259 已经报告了该问题,这似乎是来自Literal initialization via coercion (SE-0213) 的预期行为

可能的解决方法:

Algorithm.init("test") // don't coerce, call initializer
Algorithm(String("test")) // convert literal to a `String` first

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2015-02-08
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    相关资源
    最近更新 更多