Swift:带有可选链接和nil-coalescing的编译时错误

时间:2017-03-21 19:17:14

标签: swift optional-chaining

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

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

1 个答案:

答案 0 :(得分: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