TL; DR
popViewController(animated:)
zwraca UIViewController?
, a kompilator wyświetla to ostrzeżenie, ponieważ nie przechwytujesz wartości. Rozwiązaniem jest przypisanie go do podkreślenia:
_ = navigationController?.popViewController(animated: true)
Swift 3 Change
Przed wersją Swift 3 wszystkie metody miały domyślnie „wynik do odrzucenia”. Ostrzeżenie nie pojawi się, jeśli nie uchwycisz, co zwróciła metoda.
Aby powiedzieć kompilatorowi, że wynik powinien zostać przechwycony, trzeba było dodać @warn_unused_result
przed deklaracją metody. Byłby używany do metod, które mają zmienną postać (np. sort
I sortInPlace
). Dodałbyś, @warn_unused_result(mutable_variant="mutableMethodHere")
żeby poinformować o tym kompilator.
Jednak w Swift 3 zachowanie jest odwrócone. Wszystkie metody ostrzegają teraz, że zwracana wartość nie jest przechwytywana. Jeśli chcesz powiedzieć kompilatorowi, że ostrzeżenie nie jest konieczne, dodajesz @discardableResult
przed deklaracją metody.
Jeśli nie chcesz używać zwracanej wartości, musisz jawnie powiedzieć kompilatorowi, przypisując ją do znaku podkreślenia:
_ = someMethodThatReturnsSomething()
Motywacja do dodania tego do Swift 3:
- Zapobieganie możliwym błędom (np. Używanie
sort
myślenia modyfikuje kolekcję)
- Wyraźny zamiar nie przechwytywania lub konieczności przechwytywania wyniku dla innych współpracowników
Interfejs API UIKit wydaje się być opóźniony, nie dodając @discardableResult
do całkowicie normalnego (jeśli nie bardziej powszechnego) użycia popViewController(animated:)
bez przechwytywania wartości zwracanej.
Czytaj więcej
let
: możesz po prostu przypisać do _ bez poprzedzania go za pomocąlet
lubvar
.@discardableResult
) dla funkcji, które zwracają wartość, ale tam, gdzie oczekuje się, że można zignorować zwracaną wartość. UIKit po prostu nie zastosował tej adnotacji do swojego interfejsu API.Kiedy życie daje ci cytryny, zrób przedłużenie:
Pamiętaj, że dodanie czegoś takiego
@discardableResult func pop(animated: Bool) -> UIViewController?
spowoduje ostrzeżenie, którego próbujesz uniknąć.Dzięki rozszerzeniu możesz teraz pisać:
Edycja: Dodano także popToRoot.
źródło
W Swift 3 ignorowanie wartości zwracanej przez funkcję, która ma zadeklarowaną wartość zwrotną, powoduje wyświetlenie ostrzeżenia.
Jednym ze sposobów rezygnacji z tego jest oznaczenie funkcji
@discardableResult
atrybutem. Ponieważ nie masz kontroli nad tą funkcją, to nie zadziała.Inną metodą pozbycia się ostrzeżenia jest przypisanie wartości
_
. To informuje kompilator, że wiesz, że metoda zwraca wartość, ale nie chcesz zachować jej w pamięci.źródło
_
brzydoty, dopóki Apple nie zaktualizuje UIKit tym nowym atrybutem.@discardableResult
nie działa (przynajmniej nadal krakuje przy 8b4). Friedrich Schiller uwielbiał zgniłe jabłka. Prawdopodobnie kwestia gustu :-(Chociaż to,
work correctly if kept as it is
alenumber of warning increases.
Rozwiązaniem jest po prostu,
replace it with underscore ( _ )
choć wydaje się brzydkie.źródło
W tej sytuacji użyj discardableResult .
Zgodnie z <Swift Programming Language>, rozdział Language Reference - Atrybuty.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html#//apple_ref/doc/uid/TP40014097-CH35-ID347
Demo znajduje się również w <Swift Programming Language>, rozdział Language Guide - Methods.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-ID234
źródło
Jeśli chcesz iść drogą rozszerzeń takich jak odpowiedź CodeReaper, powinieneś użyć
@descardableResult
. Zachowuje to wszystkie możliwości, ale wycisza ostrzeżenie.źródło
Innym sposobem jest rozpakowanie
self.navigationController?
wartości i wywołaniepopViewController
funkcji.źródło