Wie Case im Fall funktioniert

8

Ein alter C-Programmierer könnte etwas Hilfe mit Swift verwenden.

Ich verstehe nichts über die Fallsyntax. Zum Beispiel:

%Vor%

Der case 20...30 = age scheint der Bedingungstest für die if -Anweisung zu sein. So war ich zunächst verwirrt, als ich den Zuweisungsoperator ('=') anstelle eines Vergleichsoperators ('==') benutzte.

Ok, dachte ich mir, das bedeutet wahrscheinlich, dass die case -Anweisung tatsächlich ein Funktionsaufruf ist, der einen booleschen Wert zurückgibt. Der zurückgegebene Wert erfüllt dann den Vergleichstest in der if -Anweisung.

Als Versuch habe ich versucht, die case -Anweisung wie einen regulären konditionellen Test zu behandeln und Klammern darum zu setzen. Swift akzeptiert gerne if (x == 5) oder if (true) . Aber if (case 20...30 = age) erzeugt einen Fehler. Daher scheint sich die case -Anweisung nicht wie eine Funktion zu verhalten.

Ich bin nur neugierig zu verstehen, was hier passiert. Jede Einsicht würde sehr geschätzt werden.

    
oldCoder 17.06.2016, 18:45
quelle

3 Antworten

10

Der Operator ist if case , Sie können also keine Klammern setzen. Die Syntax und das Verhalten basieren auf denen der case -Anweisung in einer Swift switch -Anweisung (siehe mein Online-Buch wenn Sie Details benötigen. In einer case -Anweisung ist 20...30 ein Intervall, das als -Muster verwendet wird und mit contains gegen das Intervall arbeitet. Das Gleichheitszeichen ist tatsächlich wirklich verwirrend, aber das war der erste Versuch einer Syntax, um auszudrücken, womit die case -Anweisung verglichen werden soll (dh das -Tag , das hinter dem switch -Schlüsselwort in a steht switch statement).

Also, wenn Sie das verstehen:

%Vor%

... dann verstehst du, wie es direkt in dieses verwandelt wird:

%Vor%     
matt 17.06.2016 18:53
quelle
4

@matt erklärt sehr gut, was dieser Code tut. Ich bin hier, um eine bessere Alternative vorzuschlagen.

Sie können die % co_de verwenden % Operator, um Bereiche zu überprüfen. Es ist ein regulärer Operator / Funktion, die nur ~= zurückgibt, ohne spezielle Sprachmagie.

%Vor%     
Alexander 17.06.2016 19:00
quelle
1

Nur noch ein Hinweis zu diesen Swift-Operatoren. Man muss bedenken, dass Swift einen sehr fortgeschrittenen und abstrahierten Compiler hat, also sind Schlüsselwörter nur Schlüsselwörter, und ihr Verhalten hängt von ihrer Verwendung ab. Im Gegensatz zu C (und anderen syntaktisch verwandten Sprachen von C ++ bis JavaScript), wo if einfach zum Testen eines booleschen Werts (oder etwas, der in eins konvertiert werden kann) verwendet wird, ist das Konzept der if -Anweisung sehr viel breiter. Im Allgemeinen denke ich daran, den Zugriff auf einen Bereich durch Verwendung einer Vielzahl von Techniken, einschließlich boolescher Tests, zu ermöglichen.

Sie können sich if , guard , while und repeat - while als allgemeinere Kontrollflussanweisungen vorstellen, mit wesentlich erweitertem Verhalten. Sicherlich können sie immer noch einen booleschen Wert testen, aber sie können auch andere Bedingungen testen. In Ihrem Szenario lautet die getestete Bedingung, ob eine Variable mit einem definierten Muster übereinstimmt (stimmt age mit dem Muster 20...30 überein).

Sie können auch testen, ob eine Variable erfolgreich auf einen nicht nil -Wert ( if let ) gesetzt wurde. Das Ergebnis der let -Operation gibt keinen Booleschen Wert zurück, da es jedoch innerhalb der if -Anweisung auftritt, weiß die Swift-Laufzeitumgebung, dass sie Teil des Kontrollflusses ist. Beachten Sie auch, dass dies das Verhalten von let geringfügig ändert, insofern als Code innerhalb des Blocks if nun den neuen Wert nicht nil anzeigt und sichergestellt ist, dass es nicht nil ist.

Diese Verhaltensweisen können auch wie folgt mit Kommas kombiniert werden:

%Vor%

Das Konzept von if let oder if case als separate Operatoren ist ... nicht genau darüber nachzudenken.

Und wie gesagt, diese Syntax ist auch in anderen Kontrollflüssen gültig:

%Vor%     
Ben Leggiero 15.12.2017 19:28
quelle

Tags und Links