TL; DR
popViewController(animated:)
retorna UIViewController?
e o compilador está emitindo esse aviso, pois você não está capturando o valor. A solução é atribuí-lo a um sublinhado:
_ = navigationController?.popViewController(animated: true)
Mudança rápida 3
Antes do Swift 3, todos os métodos tinham um "resultado descartável" por padrão. Nenhum aviso ocorreria quando você não capturasse o que o método retornou.
A fim de dizer ao compilador que o resultado deve ser capturado, você teve que adicionar @warn_unused_result
antes da declaração de método. Seria usado para métodos que têm uma forma mutável (ex. sort
E sortInPlace
). Você adicionaria @warn_unused_result(mutable_variant="mutableMethodHere")
para informar ao compilador.
No entanto, com o Swift 3, o comportamento é invertido. Todos os métodos agora alertam que o valor de retorno não é capturado. Se você quiser informar ao compilador que o aviso não é necessário, adicione-o @discardableResult
antes da declaração do método.
Se você não quiser usar o valor de retorno, precisará informar explicitamente o compilador atribuindo-o a um sublinhado:
_ = someMethodThatReturnsSomething()
Motivação para adicionar isso ao Swift 3:
- Prevenção de possíveis erros (por exemplo, usando o
sort
pensamento de modificar a coleção)
- Intenção explícita de não capturar ou precisar capturar o resultado para outros colaboradores
A API do UIKit parece estar atrasada nisso, não adicionando @discardableResult
para o uso perfeitamente normal (se não mais comum) popViewController(animated:)
sem capturar o valor de retorno.
consulte Mais informação
let
: você pode simplesmente atribuir a _ sem precedê-lo comlet
ouvar
.@discardableResult
) para funções que retornam um valor, mas onde é esperado que alguém possa ignorar o valor de retorno. O UIKit simplesmente não aplicou essa anotação à API.Quando a vida lhe der limões, faça uma extensão:
Observe que adicionar algo como
@discardableResult func pop(animated: Bool) -> UIViewController?
resultará no mesmo aviso que você está tentando evitar.Com a extensão, agora você pode escrever:
Edit: Adicionado popToRoot também.
fonte
No Swift 3, ignorar o valor de retorno de uma função que possui um valor de retorno declarado resulta em um aviso.
Uma maneira de desativar isso é marcar a função com o
@discardableResult
atributo Como você não tem controle sobre essa função, isso não funcionará.O outro método para se livrar do aviso é atribuir o valor a
_
. Isso informa ao compilador que você sabe que o método retorna um valor, mas não deseja mantê-lo na memória.fonte
_
até a Apple atualizar o UIKit com esse novo atributo.@discardableResult
, não funciona (pelo menos ainda resmunga com 8b4). Friedrich Schiller adorava maçãs podres. Provavelmente uma questão de gosto :-(Embora,
work correctly if kept as it is
mas onumber of warning increases.
A solução é simplesmente
replace it with underscore ( _ )
parecer feia.fonte
Use discardableResult nesta condição.
De acordo com <Swift Programming Language>, capítulo Reference Language - Attributes.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html#//apple_ref/doc/uid/TP40014097-CH35-ID347
Há também uma demonstração em <Swift Programming Language>, capítulo Guia de idiomas - Métodos.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-ID234
fonte
Se você quiser seguir o caminho de extensões como a resposta do CodeReaper, use
@descardableResult
. Isso mantém todas as possibilidades, mas silencia o aviso.fonte
Outra maneira é você pode desembrulhar o
self.navigationController?
valor e chamar apopViewController
função.fonte