【问题标题】:Swift: compile-time error with optional chaining and nil-coalescingSwift:带有可选链接和零合并的编译时错误
【发布时间】:2023-04-05 04:02:02
【问题描述】:

我对 Swift 中的可选链接和 nil-coalescing 有一个奇怪的问题。 谁能解释为什么以下代码无法编译:

class A<T> {
    var val: T
    var x: A<T>?
    var y: A<T>?
    init(t:T){
        val = t
    }
    func test() -> [T] {
        return (self.x?.test() ?? []) + [val] + (self.y?.test() ?? [])
    }
}

但是写的时候

func test() -> [T] {
    return (self.x?.test() ?? []) + ([val] + (self.y?.test() ?? []))
}

有吗? 错误说:

Cannot convert value of type '[T]?' to expected argument type '[_]?'

对我来说,它看起来很像编译器错误。

【问题讨论】:

  • 它看起来确实有点像一个错误。也许去他们的bugs页面发帖。

标签: swift optional-chaining


【解决方案1】:

对于复杂的表达式,类型推断很困难。 [_] 通常意味着类型未知 - 无法推断。简化表达式可以在 99% 的时间内解决问题:

class A<T> {
    var val: T
    var x: A<T>?
    var y: A<T>?
    init(t:T){
        val = t
    }
    func test() -> [T] {
        let xResult = self.x?.test() ?? []
        let yResult = self.y?.test() ?? []

        return xResult + [val] + yResult
    }
}

另外 99% 的情况下,类型推断问题可以通过显式指定类型来解决:

return (self.x?.test() as [T]? ?? []) + [val] + (self.y?.test() ?? [])

您自己找到了解决方法。带有括号的解决方法会删除一定数量的类型推断路径。

报告为SR-4309

【讨论】:

  • 这确实为问题提供了一个很好的解决方案。也许 Swift 团队仍然有兴趣看到上面发布的一些有问题的代码,尽管我怀疑它是否会是高优先级,如果有优先级的话,最终会得到解决。
  • @MichaelFourre 我认为类似的问题已经被多次报告过。我记得关于 SO 的问题。这个表达式其实挺简单的,所有的变量都在作用域内定义好了,应该没有推论的余地。根本原因可能是与运算符的串联。
  • @MichaelFourre 我检查了报告的类型推断错误,我决定最后报告它。
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
相关资源
最近更新 更多