Unterschied zwischen @warn_unqualified_access und @warn_unused_result?

7

Kann jemand das mit warn_unqualified_access und warn_unused_result

erklären?     
Padalingam 18.02.2016, 03:50
quelle

2 Antworten

23

@warn_unused_result

Angenommen, Sie haben ein Array, das ein Kartenspiel darstellt:

%Vor%

Sie möchten eine Funktion schreiben, um eine Karte einem Spieler zuzuteilen. Du willst die "oberste" Karte vom Stapel ziehen, sie der Hand des Spielers hinzufügen und sie aus dem Stapel entfernen:

%Vor%

Wenn Sie Ihre App testen, sind Sie verwirrt. Alle Hände deiner Spieler sind mit Kopien derselben Karte gefüllt.

Wenn du neu bei Swift bist, denkst du dropLast ändert deck , indem es das letzte Element entfernt. Leider irren Sie sich. Es gibt ein neues -Array zurück, das alle bis auf das letzte Element von deck enthält. (Technisch gibt es ein ArraySlice zurück.)

Der Compiler und die Standardbibliothek haben sich zusammengeschlossen, um Ihnen zu helfen, das Problem zu lösen. Die Funktion dropLast wird mit @warn_unused_result kommentiert, sodass Xcode eine Warnung für den Aufruf dropLast anzeigt:

%Vor%

Wenn Sie die Warnung sehen, entscheiden Sie sich dafür, auf dropLast zu klicken und lesen Sie die Dokumentation, die Ihnen sagt, was dropLast macht (gibt ein neues Array zurück), und Sie müssen die Zeile ändern zu:

%Vor%

Viele, viele Funktionen in der Swift-Standardbibliothek und in anderen Bibliotheken sind hauptsächlich nützlich für das, was sie zurückgeben. Das Ignorieren des zurückgegebenen Werts einer dieser Funktionen ist normalerweise ein Fehler. Daher erleichtert es Swift dem Bibliotheksautor, den Benutzer vor diesem Verhalten zu warnen. In der Tat wird Swift wahrscheinlich bald geändert , um @warn_unused_result standardmäßig anzuwenden, und Verwenden eines neuen @discardableResult -Attributs für die Funktion zum Unterdrücken der Warnung.

@warn_unqualified_access

Du warst so erfolgreich mit deinem tollen Kartenspiel auf iOS, dass du beschlossen hast, es auf Mac OS X zu portieren. Auf Mac OS X verwendest du NSView anstelle von UIView , um Dinge auf dem Bildschirm zu zeigen. Sie versuchen herauszufinden, warum Ihr benutzerdefiniertes CardView sich nicht korrekt darstellt. Daher möchten Sie Swift's Standard-Funktion print in drawRect:

aufrufen %Vor%

Wenn Sie Ihre App ausführen, überrascht es Sie, dass der Druckdialog erscheint! Was ist los? Der Compiler und NSView haben sich zusammengeschlossen, um Ihnen zu helfen, das Problem zu lösen. Die Funktion NSView.print wird mit @warn_unqualified_access kommentiert, sodass Xcode eine Warnung für den Aufruf print anzeigt:

%Vor%

Wenn Sie die Warnung sehen, klicken Sie auf print und lesen Sie die Dokumentation. Sie erfahren, dass NSView über eine eigene Methode print verfügt, mit der der Benutzer den Inhalt der Ansicht auf Papier drucken kann. Wie drollig! Jetzt erkennen Sie, dass Sie den Aufruf ändern müssen, um Swift% print Funktion wie folgt explizit zu verwenden:

%Vor%

(Es ist praktisch unmöglich, für Mac OS X in Swift zu entwickeln, ohne in diesen speziellen Fall zu kommen. Wiederholt.)

Diese Art von Problem ist viel seltener als das andere Problem, das Ergebnis einer Funktion zu ignorieren. NSView.print ist der einzige Fall, an den ich mich erinnern kann.

    
rob mayoff 20.03.2016 04:36
quelle
5

Betrachten Sie das folgende Beispiel:

%Vor%

Dies erzeugt zwei Warnungen.

Eins in C.foo() :

  

Warnung: Verwendung von 'foo' als Referenz auf die Instanzmethode in Klasse 'C'            benutze 'selbst'. um diese Warnung zu unterdrücken

Das liegt daran, dass ich foo as @warn_unqualified_access deklariert habe, was bedeutet, dass der Compiler möchte, dass ich explizit auf das Objekt referenziere, wenn ich auf dieses Mitglied zugreife. Dies liegt zum Beispiel daran, dass print in einer Unterklasse von NSView -Konflikte zwischen Swift.print und NSView.print

aufgerufen wird

Die zweite Warnung wird in main() erzeugt, wenn der Balken aufgerufen wird:

  

Warnung: Ergebnis des Aufrufs von 'bar' ist unbenutzt c.bar (1)

Das liegt daran, dass ich bar() anrufe, als @warn_unused_result deklariert und dann das Ergebnis verwerfe. Dies ist zum Beispiel bei Methoden nützlich, die Ihnen einen neuen Wert zurückgeben, aber keine Nebenwirkungen haben. Wenn Sie den neuen Wert ignorieren, verschwenden Sie im Wesentlichen Arbeit. Der Compiler kann Sie warnen, darauf hinzuweisen.

    
Enrico Granata 18.02.2016 04:00
quelle

Tags und Links