TL; DR
popViewController(animated:)
vuelve UIViewController?
, y el compilador está dando esa advertencia ya que no está capturando el valor. La solución es asignarlo a un guión bajo:
_ = navigationController?.popViewController(animated: true)
Cambio rápido 3
Antes de Swift 3, todos los métodos tenían un "resultado descartable" por defecto. No se produciría ninguna advertencia cuando no capturara lo que devolvió el método.
Para decirle al compilador que se debe capturar el resultado, debe agregarlo @warn_unused_result
antes de la declaración del método. Se usaría para métodos que tienen una forma mutable (ej. sort
Y sortInPlace
). Agregarías @warn_unused_result(mutable_variant="mutableMethodHere")
para contarle al compilador.
Sin embargo, con Swift 3, el comportamiento se voltea. Todos los métodos ahora advierten que el valor de retorno no se captura. Si desea decirle al compilador que la advertencia no es necesaria, agregue @discardableResult
antes de la declaración del método.
Si no desea utilizar el valor de retorno, debe decirle explícitamente al compilador asignándolo a un guión bajo:
_ = someMethodThatReturnsSomething()
Motivación para agregar esto a Swift 3:
- Prevención de posibles errores (por ejemplo, usando
sort
pensar que modifica la colección)
- Intento explícito de no capturar o necesitar capturar el resultado para otros colaboradores
La API de UIKit parece estar retrasada en esto, no agregando @discardableResult
para el uso perfectamente normal (si no más común) popViewController(animated:)
sin capturar el valor de retorno.
Lee mas
let
: solo puede asignar a _ sin precederlo conlet
ovar
.@discardableResult
) para funciones que devuelven un valor pero donde se espera que uno pueda ignorar el valor devuelto. UIKit simplemente no ha aplicado esa anotación a su API.Cuando la vida te dé limones, haz una extensión:
Tenga en cuenta que agregar algo como esto
@discardableResult func pop(animated: Bool) -> UIViewController?
dará como resultado la misma advertencia que está tratando de evitar.Con la extensión ahora puedes escribir:
Editar: También se agregó popToRoot.
fuente
En Swift 3, ignorar el valor de retorno de una función que tiene un valor de retorno declarado da como resultado una advertencia.
Una forma de optar por esto es marcar la función con el
@discardableResult
atributo. Como no tienes control sobre esta función, eso no funcionará.El otro método para deshacerse de la advertencia es asignar el valor a
_
. Esto le dice al compilador que sabe que el método devuelve un valor pero no desea retenerlo en la memoria.fuente
_
hasta que Apple actualice UIKit con este nuevo atributo.@discardableResult
no funciona (al menos todavía se rompe con 8b4). Friedrich Schiller amaba las manzanas podridas. Probablemente sea una cuestión de gustos :-(Aunque solo sea
work correctly if kept as it is
elnumber of warning increases.
La solución es simplemente
replace it with underscore ( _ )
aunque parezca feo.fuente
Utilice discardableResult en esta condición.
De acuerdo con <Swift Programming Language>, capítulo Referencia del lenguaje - Atributos.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html#//apple_ref/doc/uid/TP40014097-CH35-ID347
También hay una demostración en <Swift Programming Language>, capítulo Guía del lenguaje - Métodos.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-ID234
fuente
Si desea seguir el camino de las extensiones como la respuesta de CodeReaper, debe usar
@descardableResult
. Esto mantiene todas las posibilidades, pero silencia la advertencia.fuente
Otra forma es que puede desenvolver el
self.navigationController?
valor y llamar a lapopViewController
función.fuente