TL; DR
popViewController(animated:)
возвращает UIViewController?
, и компилятор выдает это предупреждение, так как вы не фиксируете значение. Решение состоит в том, чтобы назначить это подчеркивание:
_ = navigationController?.popViewController(animated: true)
Swift 3 Change
До Swift 3 все методы по умолчанию имели «отбрасываемый результат». Никакого предупреждения не произойдет, если вы не поймете, что возвратил метод.
Чтобы сообщить компилятору, что результат должен быть получен, вы должны были добавить его @warn_unused_result
до объявления метода. Он будет использоваться для методов, которые имеют изменяемую форму (например, sort
и sortInPlace
). Вы бы добавили, @warn_unused_result(mutable_variant="mutableMethodHere")
чтобы сообщить об этом компилятору.
Однако в Swift 3 поведение переворачивается. Все методы теперь предупреждают, что возвращаемое значение не фиксируется. Если вы хотите сообщить компилятору, что предупреждение не нужно, вы добавляете его @discardableResult
перед объявлением метода.
Если вы не хотите использовать возвращаемое значение, вы должны явно указать компилятору, присвоив его подчеркиванию:
_ = someMethodThatReturnsSomething()
Мотивация для добавления этого в Swift 3:
- Предотвращение возможных ошибок (например, используя
sort
мышление, оно изменяет коллекцию)
- Явное намерение не захватывать или не нужно захватывать результат для других соавторов
UIKit API, кажется, отстает от этого, не добавляя @discardableResult
для совершенно нормального (если не более общего) использования popViewController(animated:)
без захвата возвращаемого значения.
Читать далее
let
: вы можете просто присвоить _, не предшествуя ему с помощьюlet
илиvar
.@discardableResult
) для функций, которые возвращают значение, но там, где ожидается, что можно игнорировать возвращаемое значение. UIKit просто не применил эту аннотацию к своему API.Когда жизнь дает вам лимоны, сделайте расширение:
Обратите внимание, что добавление чего-то подобного
@discardableResult func pop(animated: Bool) -> UIViewController?
приведет к тому же предупреждению, которого вы пытаетесь избежать.Теперь с расширением вы можете написать:
Редактировать: добавлен popToRoot тоже.
источник
В Swift 3 игнорирование возвращаемого значения функции с объявленным возвращаемым значением приводит к предупреждению.
Один из способов отказаться от этого - пометить функцию
@discardableResult
атрибутом. Поскольку у вас нет контроля над этой функцией, это не сработает.Другой способ избавиться от предупреждения - присвоить значение
_
. Это говорит компилятору, что вы знаете, что метод возвращает значение, но вы не хотите сохранять его в памяти.источник
_
пока Apple не обновит UIKit с этим новым атрибутом.@discardableResult
, не работает (по крайней мере, это все еще каркает с 8b4). Фридрих Шиллер любил гнилые яблоки. Вероятно, дело вкуса :-(Хотя это
work correctly if kept as it is
ноnumber of warning increases.
Решение состоит в том, чтобы просто,
replace it with underscore ( _ )
хотя это кажется уродливым.источник
Используйте discardableResult в этом состоянии.
Согласно <Swift Programming Language>, глава Справочник по языку - Атрибуты.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html#//apple_ref/doc/uid/TP40014097-CH35-ID347
Также есть демонстрация в <Swift Programming Language>, глава Language Guide - Методы.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-ID234
источник
Если вы хотите пойти по пути расширений, таких как ответ CodeReaper, вы должны использовать
@descardableResult
. Это сохраняет все возможности, но заставляет замолчать предупреждение.источник
Другой способ - вы можете развернуть
self.navigationController?
значение и вызватьpopViewController
функцию.источник