Bedingter Ausdruck im Python-Stil in Swift 3

8

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:

%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?

    
Palimondo 04.05.2017, 21:33
quelle

2 Antworten

7
___ tag123swift ___ Swift ist eine universelle Open-Source-Programmiersprache, die von Apple Inc. für ihre Plattformen und Linux entwickelt wurde. Verwenden Sie das Tag nur für Fragen zu Sprachfunktionen oder für Code in Swift. Verwenden Sie die Tags [ios], [osx], [watch-os], [tvos], [cocoa-touch] und [cocoa] für (sprachunabhängige) Fragen zu den Plattformen oder Frameworks. ___ qstnhdr ___ Bedingter Ausdruck im Python-Stil in Swift 3 ___ antwort43794153 ___

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%     
___ qstntxt ___

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?

    
___ answer47840461 ___

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.

    
___
Gary Makin 04.05.2017, 23:17
quelle
0

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:

%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.

    
Tadhg McDonald-Jensen 15.12.2017 22:04
quelle

Tags und Links