2017-06-06 19 views
0

私はいくつかのエクササイズ練習を完了しています。関数呼び出しの即時返却結果

func allData() -> [Int] { 
    return (left?.allData() ?? []) + [data] + (right?.allData() ?? []) 
} 

しかし:

は私のように1行に次の関数を入れたい(コンテキストは、私が以前スウィフトでこれを経験してきたように、質問には関係ありませんが)一つは、バイナリツリーですエラーが

OK]を[INT] 'に変換「のInt」されていないが、別の行に分割は正常である:実際に、それはでコンパイルされます

func allData() -> [Int] { 
    let leftdata = left?.allData() ?? [] 
    let rightdata = right?.allData() ?? [] 
    return (leftdata) + [data] + (rightdata) 
} 

いずれか左のデータ、右のデータ、[データ]ですが、両方ではありません。

運動の中で私は人々がこれを1行で解決しなかったことがわかります。

なぜ

return (left?.allData() ?? []) + [data] + (right?.allData() ?? []) 

が無効ですか?

+0

何ALLDATA ()メソッドが返す? –

+0

Integerの配列(実際にはInorderを使ったツリーのデータ) – stevenpcurtis

+0

'left'、' right'、 'data'の宣言は何ですか? –

答えて

2

これは、複数のエントリが一緒に追加されていることがよくあります。オプションと非オプションの型(3つ以上)を1つのステートメントに組み合わせると、コンパイラの型処理が混乱することがあります。

http://stackoverflow.com/q/43595162/5237560

、ここで別の1:ここでは非常に似て質問があり

要するに

http://stackoverflow.com/q/42568446/5237560

は、コンパイラはとして検出されていないいくつかのケースで助けを必要とします「あまりにも複雑ですが、実際に間違ったデータ型が推定されます。

0

多くの場合、xcodeは妥当な時間でコンパイルするには複雑すぎるため、ステートメントをコンパイルしません。したがって、このステートメントを分割することで問題が解決されます。

+0

興味深い。しかし、それは通常、その旨のメッセージをもたらします。この場合のステートメントはまったく異なります。アイデアのソースがありますか? – stevenpcurtis

+0

私には同じ事件はなかった。しかし、Xcodeは、場合によっては無効なエラーで私を驚かせることは決してありません! –

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 } 
} 
関連する問題