235 votes

Xcode 8 / Swift 3: avertissement "Une expression de type UIViewController? N'est pas utilisée"

J'ai la fonction suivante qui compile proprement auparavant mais génère un avertissement avec Xcode 8.

 func exitViewController()
{
    navigationController?.popViewController(animated: true)
}
 

"Expression de type" UIViewController? "N'est pas utilisée".

Pourquoi dit-il cela et y a-t-il un moyen de l'enlever?

Le code s'exécute comme prévu.

504voto

tktsubota Points 7954

TL;DR

popViewController(animated:) retours UIViewController?, et le compilateur est en donnant cet avertissement, car vous n'êtes pas la capture de la valeur. La solution consiste à attribuer à un trait de soulignement:

_ = navigationController?.popViewController(animated: true)

Swift 3 Changement

Avant de Swift 3, toutes les méthodes ont eu un "jetables" résultat par défaut. Pas d'avertissement se produit lorsque vous n'avez pas à saisir ce que le renvoi de la méthode.

Afin de dire au compilateur que le résultat doit être capturé, vous avez dû ajouter @warn_unused_result avant la déclaration de la méthode. Il serait utilisé pour les méthodes qui ont une mutable forme (ex. sort et sortInPlace). Souhaitez-vous ajouter d' @warn_unused_result(mutable_variant="mutableMethodHere") pour indiquer au compilateur.

Cependant, avec la Swift 3, le comportement est inversé. Toutes les méthodes maintenant avertir que la valeur de retour n'est pas capturé. Si vous voulez dire au compilateur que l'avertissement n'est pas nécessaire, vous ajoutez @discardableResult avant la déclaration de la méthode.

Si vous ne souhaitez pas utiliser la valeur de retour, vous devez explicitement indiquer au compilateur en l'affectant à un trait de soulignement:

_ = someMethodThatReturnsSomething()

La Motivation pour l'ajout de cette Swift 3:

  • La prévention d'éventuels bugs (ex. à l'aide de sort pensant qu'il modifie la collection)
  • Intention explicite de ne pas capturer ou qui ont besoin d'enregistrer le résultat pour les autres collaborateurs

Le UIKit API semble être en retard sur ce, ne pas ajouter @discardableResult pour les tout à fait normal, si pas le plus fréquent) l'utilisation d' popViewController(animated:) sans capture de la valeur de retour.

Lire Plus

38voto

CodeReaper Points 1343

Quand la vie te donne des citrons, fais une extension:

 import UIKit

extension UINavigationController {
    func pop(animated: Bool) {
        _ = self.popViewController(animated: animated)
    }

    func popToRoot(animated: Bool) {
        _ = self.popToRootViewController(animated: animated)
    }
}
 

Notez que l'ajout de quelque chose comme @discardableResult func pop(animated: Bool) -> UIViewController? donnera le même avertissement que vous essayez d'éviter.

Avec l'extension, vous pouvez maintenant écrire:

 func exitViewController()
{
    navigationController?.pop(animated: true)
}

func popToTheRootOfNav() {
    navigationController?.popToRoot(animated: true)
}
 

Edit: Ajouté popToRoot aussi.

24voto

Matthew Seaman Points 5137

Dans Swift 3, ignorant la valeur de retour d'une fonction qui a une déclaration de valeur de retour des résultats d'un avertissement.

Un moyen de ne ce est pour marquer la fonction avec l' @discardableResult d'attribut. Puisque vous n'avez pas de contrôle sur cette fonction, qui ne fonctionne pas.

L'autre méthode pour se débarrasser de l'avertissement est pour affecter la valeur de _. Elle indique au compilateur que vous connaissez la méthode retourne une valeur, mais vous ne souhaitez pas conserver en mémoire.

let _ = navigationController?.popViewController(animated: true)

5voto

Jayprakash Dubey Points 1194

Capture d'écran 1

Bien que ce soit work correctly if kept as it is mais le number of warning increases.

La solution consiste simplement à replace it with underscore ( _ ) même s’il semble être moche.

 Eg.  _ = navigationController?.popViewController(animated: true)
 

Capture d'écran 2

3voto

black_pearl Points 176

Utilisation discardableResult dans cette condition.

Selon < Swift Langage de Programmation > , le chapitre de la Langue de Référence - Attributs.

discardableResult

Appliquer cet attribut d'une fonction ou d'une déclaration de méthode pour supprimer l'avertissement du compilateur lorsque la fonction ou la méthode qui retourne une valeur est appelée sans l'aide de son résultat.

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html#//apple_ref/doc/uid/TP40014097-CH35-ID347

Il y a aussi une démo en < Swift Langage de Programmation > , chapitre Guide de Langue - Méthodes.

@discardableResult
    mutating func advance(to level: Int) -> Bool {
    ...
return true
}

Parce que ce n'est pas nécessairement une erreur de code qui appelle à l'avance(à:) de la méthode d'ignorer la valeur de retour de cette fonction est marquée avec le @discardableResult attribut. Pour plus d'informations sur cet attribut, voir les Attributs.

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-ID234

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X