我正在完成一些锻炼练习。一个是二叉树(虽然上下文与我之前在Swift中遇到过的问题无关)
我想将以下函数放在一行:
func allData () -> [Int] {
return ( left?.allData() ?? [] ) + [data] + ( right?.allData() ?? [] )
}
但错误是'Int'不能转换为'[Int]'
好的,但分成不同的行很好:
func allData () -> [Int] {
let leftdata = left?.allData() ?? []
let rightdata = right?.allData() ?? []
return ( leftdata ) + [data] + ( rightdata )
}
实际上,它将使用左数据,右数据和[数据]进行编译,但不能同时编译。
在锻炼中,我可以看到人们没有在一条线上解决这个问题。
为什么
return ( left?.allData() ?? [] ) + [data] + ( right?.allData() ?? [] )
无效?
答案 0 :(得分:2)
我经常看到这个,多个条目加在一起。在单个语句中组合选项和非可选类型(3个或更多)时,编译器的类型处理有时会混淆。
这里有一个非常相似的问题:
http://stackoverflow.com/q/43595162/5237560
另一个在这里:
http://stackoverflow.com/q/42568446/5237560
简而言之,编译器在某些情况下需要帮助,这些情况未被检测为“太复杂”。但实际上会导致推断出错误的数据类型。
答案 1 :(得分:1)
它不会回答你的“为什么”的问题,但如果你想把它作为一个单行代码,这可能会为你提供另一种选择:
func allData() -> [Int] {
return [left?.allData() ?? [], [data], right?.allData() ?? []].flatMap { $0 }
}
或
func allData() -> [Int] {
// The first flatMap removes nil elements and the second flattens the array
return [left?.allData(), [data], right?.allData()].flatMap { $0 }.flatMap { $0 }
}
答案 2 :(得分:0)
在许多情况下,xcode不会编译语句,因为它太复杂而无法在合理的时间内编译。因此,拆分语句可以解决问题。