Swift返回函数调用的结果

时间:2017-06-06 03:19:41

标签: swift

我正在完成一些锻炼练习。一个是二叉树(虽然上下文与我之前在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() ?? [] )

无效?

3 个答案:

答案 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不会编译语句,因为它太复杂而无法在合理的时间内编译。因此,拆分语句可以解决问题。