3

我对 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 '[_]?'

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

4

1 回答 1

3

复杂的表达式很难进行类型推断。这[_]通常意味着类型未知 - 无法推断。简化表达式可以在 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

于 2017-03-21T19:43:22.107 回答