2016-06-14 3 views
4

En Swift2.2, j'ai une extension Optional qui ressemble à:comment squelch "résultat non utilisés" avertissements

extension Optional { 
    func ifNotNil<T>(_ closure:(Wrapped) -> T) -> T? { 
     switch self { 
     case .some (let wrapped): 
      return closure(wrapped) 
     case .none: 
      return nil 
     } 
    } 
} 

Il permet de code comme

anImageView.image = self.something.ifNotNil { self.getImageFor($0) } 

Mais parfois, je ne se soucient pas du résultat:

myBSON["key"].string.ifNotNil { 
    print($0} 
} 

Dans Swift2.2, cela a fonctionné comme un charme. Mais en lançant la nouvelle bêta XCode8 et en convertissant en Swift3, j'obtiens des avertissements partout où je fais le second type. C'est presque comme s'il y avait un @warn_unused_result implicite. Est-ce juste un bêta précoce? Ou quelque chose que je ne peux plus faire dans Swift3? Ou quelque chose que je dois corriger dans Swift3?

+0

peut ne pas reproduire ce problème avec Xcode 8. Pouvez-vous fournir un exemple complet et reproductible reproduisant le problème plutôt que le code de boutonnière? – JAL

Répondre

6

Vous pouvez jeter le résultat en utilisant:

_ = myBSON["key"].string.ifNotNil { 
    print($0} 
} 

Ou marquer votre méthode pour ne pas mettre en garde les résultats non utilisés:

extension Optional { 

    @discardableResult func ifNotNil<T>(_ closure:(Wrapped) -> T) -> T? { 
     switch self { 
     case .some (let wrapped): 
      return closure(wrapped) 
     case .none: 
      return nil 
     } 
    } 
} 

Référence: SE-0047

+0

Grumble. J'ai cherché une contrepartie à '@ warn_unused_result'. Je dois aimer la symétrie entre les deux. L'un utilise camelCase, l'autre sous-scores. L'un est un avertissement, l'autre ne l'est pas. –

+1

Dans le portage, j'ai aussi un tas d'autres API fournies par Apple qui ne sont apparemment pas jetables. Donc n'importe où j'avais quelque chose comme 'self.navigationController? .popViewController (animé: true)', j'ai dû ajouter le préfixe '_ = ...'. Parce que, apparemment, le popViewController renvoie un contrôleur, dont je n'ai honnêtement jamais eu besoin, et que je dois maintenant ignorer explicitement. –

+0

Oui, c'est un peu confus maintenant. Mais ils passent tout à CamelCase: 'Après acceptation, cette proposition supprime deux des dernières instances de snake_case dans la langue Swift. Cela amène le langage à une utilisation cohérente et universelle des variantes de cas en minuscules et en chameaux. » –