Wann und wie wird das Attribut @noreturn in Swift verwendet?

8

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 ?

gekennzeichnet?
  

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 .

    
Ian Bell 29.06.2016, 11:46
quelle

2 Antworten

10
  

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

%Vor%

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

%Vor%

Nun können Sie Ihre Funktion in der else-Klausel einer guard -Anweisung verwenden:

%Vor%

@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 ):

%Vor%

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

geschrieben werden %Vor%     
Martin R 29.06.2016, 11:55
quelle
2

einfacher Spielplatz, um zu sehen, wie es funktioniert ...

%Vor%     
user3441734 29.06.2016 12:28
quelle

Tags und Links