Ich lese den in geschweiften Klammern eingeschlossenen Codeblock nach dem Schlüsselwort else
im Kontext eines guard-else
-Flusses, muss eine Funktion aufrufen, die mit dem noreturn
-Attribut gekennzeichnet ist, oder die Kontrolle über return
, break
, continue
oder throw
.
Der letzte Teil ist ziemlich klar, während ich den ersten nicht gut verstehe.
Zunächst gibt jede Funktion etwas zurück (zumindest ein leeres Tupel), auch wenn Sie keinen Rückgabetyp deklarieren. Zweitens, wann können wir eine Funktion noreturn
verwenden? Sind die Dokumente, die auf einige integrierte Kernmethoden hinweisen, mit noreturn
?
Die else-Klausel einer Guard-Anweisung ist erforderlich und muss entweder aufgerufen werden eine Funktion, die mit dem noreturn-Attribut oder dem Übertragungsprogramm gekennzeichnet ist Kontrolle außerhalb des umschließenden Geltungsbereichs der Guard-Anweisung unter Verwendung eines der folgende Aussagen:
%Vor%
Hier ist die Quelle .
Zunächst gibt jede Funktion etwas zurück (zumindest ein leeres Tupel), auch wenn Sie keinen Rückgabetyp deklarieren.
(@noreturn ist veraltet; siehe Swift 3 Update unten.)
Nein, es gibt Funktionen, die den Prozess sofort beenden
und kehrt nicht zum Aufrufer zurück. Diese sind in Swift markiert
mit @noreturn
, zB
und es kann mehr geben.
( Anmerkung: Ähnliche Anmerkungen existieren in anderen Programmiersprachen
oder Compiler wie [[noreturn]]
in C ++ 11, __attribute__((noreturn))
als GCC-Erweiterung oder _Noreturn
für die
Clang-Compiler.)
Sie können Ihre eigene Funktion mit @noreturn
markieren, wenn sie ebenfalls endet
der Prozess unbedingt, z.B. durch Aufruf einer der eingebauten Funktionen wie
Nun können Sie Ihre Funktion in der else-Klausel einer guard
-Anweisung verwenden:
@noreturn
functions können auch verwendet werden, um Fälle zu markieren, die "nicht sollten
auftreten "und einen Programmierfehler anzeigen. Ein einfaches Beispiel
(ein Auszug aus Fehlende Rückkehr UITableViewCell ):
Ohne myFatalError()
als @noreturn
markiert, würde der Compiler dies tun
im Standardfall über eine fehlende Rückgabe klagen.
Update: In Swift 3 (Xcode 8 beta 6) das Attribut @noreturn
wurde durch einen Never
Rückgabetyp ersetzt, so das obige Beispiel
würde jetzt als
einfacher Spielplatz, um zu sehen, wie es funktioniert ...
%Vor%