Gute Frage:)
Anstatt den Ausdruck zu speichern, speichern Sie das Ergebnis als optional, wenn die Bedingung falsch ist. Bearbeitet basierend auf einigen Kommentaren, was zu etwas saubereren Code führt.
%Vor% Nach meiner kürzlichen Auseinandersetzung mit Python habe ich gelernt, die Lesbarkeit seiner bedingten Ausdrücke zu schätzen die Form von X if C else Y
.
Wenn der klassische ternäre Bedingungsoperator?: die Bedingung als erstes Argument hat, fühlt es sich so an, als wäre die Zuweisung alles über die Wahl. Es wird hässlich, wenn Sie versuchen, mehrere ternäre Operatoren zu verschachteln ... Wenn die Bedingung nach dem ersten Ausdruck verschoben wird, fühlt es sich eher wie eine mathematische Definition einer Funktion an. Ich finde, das hilft manchmal bei der Klarheit des Codes.
Als Code-Kata wollte ich den bedingten Ausdruck im Python-Stil in Swift implementieren. Es scheint, als ob das einzige Werkzeug, das mir die erforderliche Syntax bringen kann, benutzerdefinierte Operatoren sind. Sie müssen aus Symbolen bestehen. Mathematische Symbole in Unicode kennzeichnen die doppelte Drehkreuz Symbol von Logik als TRUE ⊨
und durchgestrichen Version ist nicht wahr ⊭
... so ging ich mit ==|
und |!=
. Bis jetzt, nachdem ich eine Weile gekämpft habe, um den richtigen Vorrang zu finden, habe ich folgendes:
Ich weiß, dass das Ergebnis nicht sehr swifty aussieht oder besonders lesbar ist, aber auf der positiven Seite funktionieren diese Operatoren auch, wenn der Ausdruck über mehrere Zeilen verteilt ist.
%Vor%Wenn Sie mit Leerzeichen kreativ werden, fühlt es sich sogar etwas pythonisch an:
%Vor%Ich mag es nicht, dass die zweite autoclosure entkommen muss. Nate Cooks Antwort über benutzerdefinierte ternäre Operatoren in Swift 2 verwendete die Curry-Syntax, die nicht mehr in Swift 3 enthalten ist ... und ich denke schon war technisch auch eine flüchtige Schließung.
Gibt es eine Möglichkeit, dies zu erreichen, ohne die Schließung zu umgehen? Ist es überhaupt wichtig? Vielleicht ist der Swift-Compiler schlau genug, um dies während der Kompilierzeit zu beheben, so dass es keine Auswirkungen auf die Laufzeit hat?
Gute Frage:)
Anstatt den Ausdruck zu speichern, speichern Sie das Ergebnis als optional, wenn die Bedingung falsch ist. Bearbeitet basierend auf einigen Kommentaren, was zu etwas saubereren Code führt.
%Vor%Nach meiner kürzlichen Auseinandersetzung mit Python habe ich gelernt, die Lesbarkeit seiner bedingten Ausdrücke zu schätzen die Form von %code% .
Wenn der klassische ternäre Bedingungsoperator?: die Bedingung als erstes Argument hat, fühlt es sich so an, als wäre die Zuweisung alles über die Wahl. Es wird hässlich, wenn Sie versuchen, mehrere ternäre Operatoren zu verschachteln ... Wenn die Bedingung nach dem ersten Ausdruck verschoben wird, fühlt es sich eher wie eine mathematische Definition einer Funktion an. Ich finde, das hilft manchmal bei der Klarheit des Codes.
Als Code-Kata wollte ich den bedingten Ausdruck im Python-Stil in Swift implementieren. Es scheint, als ob das einzige Werkzeug, das mir die erforderliche Syntax bringen kann, benutzerdefinierte Operatoren sind. Sie müssen aus Symbolen bestehen. Mathematische Symbole in Unicode kennzeichnen die doppelte Drehkreuz Symbol von Logik als TRUE %code% und durchgestrichen Version ist nicht wahr %code% ... so ging ich mit %code% und %code% . Bis jetzt, nachdem ich eine Weile gekämpft habe, um den richtigen Vorrang zu finden, habe ich folgendes:
%Vor%Ich weiß, dass das Ergebnis nicht sehr swifty aussieht oder besonders lesbar ist, aber auf der positiven Seite funktionieren diese Operatoren auch, wenn der Ausdruck über mehrere Zeilen verteilt ist.
%Vor%Wenn Sie mit Leerzeichen kreativ werden, fühlt es sich sogar etwas pythonisch an:
%Vor%Ich mag es nicht, dass die zweite autoclosure entkommen muss. Nate Cooks Antwort über benutzerdefinierte ternäre Operatoren in Swift 2 verwendete die Curry-Syntax, die nicht mehr in Swift 3 enthalten ist ... und ich denke schon war technisch auch eine flüchtige Schließung.
Gibt es eine Möglichkeit, dies zu erreichen, ohne die Schließung zu umgehen? Ist es überhaupt wichtig? Vielleicht ist der Swift-Compiler schlau genug, um dies während der Kompilierzeit zu beheben, so dass es keine Auswirkungen auf die Laufzeit hat?
Ich habe keine gute Antwort darauf, wie man einen ternären Operator wie Python bildet, aber ich möchte darauf hinweisen, dass der eingebaute ternäre Operator mit Leerzeichen sehr logisch verkettet werden kann.
Zum Beispiel könnte man mit %code% blocks so etwas schreiben:
%Vor%Was zu dem verketteten ternären Operator führt, ergibt folgendes:
%Vor%Wenn man von einem Python-Hintergrund kommt, war das zunächst nicht offensichtlich, also möchte ich es mit anderen teilen.
Ich habe keine gute Antwort darauf, wie man einen ternären Operator wie Python bildet, aber ich möchte darauf hinweisen, dass der eingebaute ternäre Operator mit Leerzeichen sehr logisch verkettet werden kann.
Zum Beispiel könnte man mit if else
blocks so etwas schreiben:
Was zu dem verketteten ternären Operator führt, ergibt folgendes:
%Vor%Wenn man von einem Python-Hintergrund kommt, war das zunächst nicht offensichtlich, also möchte ich es mit anderen teilen.
Tags und Links swift