TL; DR
popViewController(animated:)
kehrt zurück UIViewController?
, und der Compiler gibt diese Warnung aus, da Sie den Wert nicht erfassen. Die Lösung besteht darin, es einem Unterstrich zuzuweisen:
_ = navigationController?.popViewController(animated: true)
Swift 3 Change
Vor Swift 3 hatten alle Methoden standardmäßig ein "verwertbares Ergebnis". Es wird keine Warnung angezeigt, wenn Sie nicht erfasst haben, was die Methode zurückgegeben hat.
Um dem Compiler mitzuteilen, dass das Ergebnis erfasst werden soll, mussten Sie @warn_unused_result
vor der Methodendeklaration hinzufügen . Es würde für Methoden verwendet, die eine veränderbare Form haben (z. B. sort
und sortInPlace
). Sie würden hinzufügen @warn_unused_result(mutable_variant="mutableMethodHere")
, um dem Compiler davon zu erzählen.
Bei Swift 3 wird das Verhalten jedoch umgedreht. Alle Methoden warnen jetzt, dass der Rückgabewert nicht erfasst wird. Wenn Sie dem Compiler mitteilen möchten, dass die Warnung nicht erforderlich ist, fügen Sie sie @discardableResult
vor der Methodendeklaration hinzu.
Wenn Sie den Rückgabewert nicht verwenden möchten, müssen Sie dies dem Compiler explizit mitteilen, indem Sie ihn einem Unterstrich zuweisen:
_ = someMethodThatReturnsSomething()
Motivation, dies zu Swift 3 hinzuzufügen:
- Verhinderung möglicher Fehler (z.
sort
B. durch das Denken, dass die Sammlung geändert wird)
- Explizite Absicht, das Ergebnis für andere Mitarbeiter nicht zu erfassen oder erfassen zu müssen
Die UIKit-API scheint dahinter zu stehen und fügt nicht @discardableResult
für die völlig normale (wenn nicht häufigere) Verwendung hinzu, popViewController(animated:)
ohne den Rückgabewert zu erfassen.
Weiterlesen
let
: Sie können einfach _ zuweisen, ohne es mitlet
oder vorangestellt zu habenvar
.@discardableResult
) für Funktionen, die einen Wert zurückgeben, bei denen jedoch erwartet wird, dass der Rückgabewert ignoriert wird. UIKit hat diese Anmerkung einfach nicht auf ihre API angewendet.Wenn das Leben Ihnen Zitronen gibt, machen Sie eine Erweiterung:
Beachten Sie, dass das Hinzufügen von so etwas zu
@discardableResult func pop(animated: Bool) -> UIViewController?
derselben Warnung führt, die Sie vermeiden möchten.Mit der Erweiterung können Sie jetzt schreiben:
Bearbeiten: PopToRoot wurde ebenfalls hinzugefügt.
quelle
In Swift 3 führt das Ignorieren des Rückgabewerts einer Funktion mit einem deklarierten Rückgabewert zu einer Warnung.
Eine Möglichkeit, dies zu deaktivieren, besteht darin, die Funktion mit dem
@discardableResult
Attribut zu markieren . Da Sie keine Kontrolle über diese Funktion haben, funktioniert dies nicht.Die andere Methode, um die Warnung zu entfernen, besteht darin, den Wert zuzuweisen
_
. Dies teilt dem Compiler mit, dass Sie wissen, dass die Methode einen Wert zurückgibt, diesen jedoch nicht im Speicher behalten möchten.quelle
_
bis Apple UIKit mit diesem neuen Attribut aktualisiert.@discardableResult
nicht (zumindest krächzt es noch mit 8b4). Friedrich Schiller liebte faule Äpfel. Wahrscheinlich Geschmackssache :-(Obwohl es
work correctly if kept as it is
doch dienumber of warning increases.
Die Lösung ist einfach,
replace it with underscore ( _ )
obwohl es hässlich zu sein scheint.quelle
Verwenden Sie in diesem Zustand discardableResult .
Gemäß <Swift Programming Language>, Kapitel Sprachreferenz - Attribute.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html#//apple_ref/doc/uid/TP40014097-CH35-ID347
Es gibt auch eine Demo in <Swift Programming Language>, Kapitel Sprachhandbuch - Methoden.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-ID234
quelle
Wenn Sie Erweiterungen wie die Antwort von CodeReaper verwenden möchten, sollten Sie diese verwenden
@descardableResult
. Dies behält alle Möglichkeiten bei, bringt aber die Warnung zum Schweigen.quelle
Eine andere Möglichkeit besteht darin, den
self.navigationController?
Wert zu entpacken und diepopViewController
Funktion aufzurufen .quelle