我在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 '[_]?'
对我而言,它看起来很像编译器错误。
答案 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