web-dev-qa-db-fra.com

Résultat de l'appel à [myFunction] n'est pas utilisé

Dans Obj-C, une pratique courante consistait à utiliser des fonctions pratiques pour effectuer des opérations courantes, telles que la configuration de la présentation automatique pour les vues:

func makeConstraint(withAnotherView : UIView) -> NSLayoutConstraint
{
   // Make some constraint 
   // ...

   // Return the created constraint
   return NSLayoutConstraint()
}

Si vous avez juste besoin de définir la contrainte et de l’oublier, vous pouvez appeler:

[view1 makeConstraint: view2]

Si vous voulez stocker la contrainte plus tard afin de pouvoir la supprimer/la modifier, vous feriez quelque chose comme:

NSLayoutConstraint * c;
c = [view1 makeConstraint: view2]

Je veux faire cela dans Swift, mais si j'appelle la fonction ci-dessus et ne capture pas la contrainte renvoyée, je reçois l'avertissement:

Result of call to 'makeConstraint(withAnotherView:)' is unused

Très ennuyant. Existe-t-il un moyen de faire savoir à Swift que je ne veux pas toujours capturer la valeur de retour?

NOTE: Je sais à ce sujet. C'est moche et pas ce que je cherche:

_ = view1.makeConstraint(withAnotherView: view2)
15
GoldenJoe

C'est un comportement qui a été introduit dans Swift 3. Au lieu d'avoir à annoter explicitement les fonctions avec @warn_unused_result afin d'indiquer au compilateur que le résultat devrait être utilisé par l'appelant, il s'agit désormais du comportement par défaut.

Vous pouvez utiliser l'attribut @discardableResult sur votre fonction pour informer le compilateur que la valeur de retour ne doit pas nécessairement être "consommée" par l'appelant.

@discardableResult
func makeConstraint(withAnotherView : UIView) -> NSLayoutConstraint {

   ... // do things that have side effects

   return NSLayoutConstraint()
}

view1.makeConstraint(view2) // No warning

let constraint = view1.makeConstraint(view2) // Works as expected

Vous pouvez lire plus en détail sur ce changement sur la proposition d'évolution .

25
Hamish

Vous pouvez essayer de désactiver les avertissements à partir des paramètres de construction de votre projet. J'aime la question, bon point. Fait quelques recherches et a trouvé ceci. https://stackoverflow.com/a/34932152/5615274

Je ne l'ai pas encore testé.

0
Robert Sandru