2017-06-06 5 views
0

Ich absolviere einige Übungen. Eine davon ist ein binärer Baum (obwohl der Kontext auf die Frage nicht relevant ist, wie ich dies in Swift zuvor erlebt haben)Schnelle Rückmeldung von Funktionsaufrufen

Ich möchte die folgende Funktion auf eine Zeile setzen wie:

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

Aber die Fehler ‚Int‘ ist nicht konvertierbar '[Int]

Ok, aber die Aufteilung in getrennte Leitungen ist in Ordnung:

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

In der Tat wird es kompilieren entweder mit dem linke Daten, rechte Daten und [Daten], aber nicht beides.

Innerhalb des Trainings kann ich sehen, dass die Leute das nicht in einer Zeile gelöst haben.

Warum ist

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

ungültig?

+0

WHAT ALLDATA() Methode gibt zurück? –

+0

Ein Array von Ganzzahl (in der Tat die Daten in einem Baum mit Inorder) – stevenpcurtis

+0

Was sind die Deklarationen für 'links',' rechts' und 'data'? –

Antwort

2

Ich habe das oft mit mehreren Einträgen zusammen gesehen. Die Typverarbeitung des Compilers wird manchmal verwirrt, wenn Optionale und nicht optionale Typen (3 oder mehr) in einer einzigen Anweisung kombiniert werden.

Es gibt eine sehr ähnliche Frage hier ist:

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

und ein anderer hier:

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

Kurz gesagt, helfen den Compiler Bedürfnisse in einigen Fällen, die nicht erkannt werden "zu komplex", führt aber dazu, dass der falsche Datentyp abgeleitet wird.

0

In vielen Fällen kompiliert xcode keine Anweisung, da sie zu komplex ist, um in einer angemessenen Zeit kompiliert zu werden. Daher löst das Aufteilen der Anweisung das Problem.

+0

Interessant. Aber das führt normalerweise zu einer entsprechenden Botschaft; In diesem Fall ist die Aussage ganz anders. Haben Sie eine Quelle für Ihre Idee? – stevenpcurtis

+0

Ich hatte nie den gleichen Fall wie du. Xcode überrascht mich jedoch immer wieder mit Fehlern, die in einigen Fällen ungültig sind! –

1

Es wird nicht Ihre „Warum“ Frage beantworten, aber dies könnte Ihnen eine Alternative anbieten, wenn Sie es als Einzeiler behalten möchten:

func allData() -> [Int] { 
    return [left?.allData() ?? [], [data], right?.allData() ?? []].flatMap { $0 } 
} 

oder

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 } 
} 
Verwandte Themen