web-dev-qa-db-fra.com

L'opérateur binaire '===' ne peut pas être appliqué aux opérandes de type 'Any?' et 'UIBarButtonItem!'

Le code suivant permettait de compiler dans Swift 2.2, n'est plus dans Swift 3.0. Comment pouvons-nous résoudre ce problème?

Erreur: l'opérateur binaire '===' ne peut pas être appliqué aux opérandes de type 'Any?' et 'UIBarButtonItem!'

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if sender === saveButton { // Error!
        // ... 
    } else if sender === closeButton { // Error!
        // ...
    }
}
27
Yuchen Zhong

Comme le message d'erreur le dit. Dans Swift 3, Objecitve-C id est importé sous le nom Any et vous ne pouvez appeler aucune opération pour Any, y compris ===, sans distribution explicite.

Essaye ça:

if sender as AnyObject? === saveButton {

(Tous les mêmes pour les autres comparaisons sender.)

Et rappelez-vous, dans Swift 3, as AnyObject est devenu l’une des opérations les plus risquées, vous ne devez pas utiliser as AnyObject dans d'autres cas.

49
OOPer

Essayez d’utiliser la liaison facultative avec la conversion conditionnelle pour établir le type de l’élément avant de comparer:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let sender = sender as? UIBarButtonItem, sender === saveButton {
        // ...
    } else if let sender = sender as? UIBarButtonItem, sender === closeButton {
        // ...
    }
}
13
vacawama