Swift 2 Array Contient un objet?
Pourquoi n'est-ce pas de travail? Je peux utiliser un tableau.contains() sur une Chaîne, mais il ne fonctionne pas pour un Objet.
var array = ["A", "B", "C"]
array.contains("A") //True
class Dog {
var age = 1
}
var dogs = [Dog(), Dog(), Dog()]
var sparky = Dog()
dogs.contains(sparky) // Error Cannot convert value of type 'Dog' to expected argument type '@noescape (Dog) throws -> Bool
source d'informationauteur Mitchell Hudson
Vous devez vous connecter pour publier un commentaire.
Votre
Dog
besoins pour mettre en œuvreEquatable
.À vraiment expliquer ce qui s'y passe, nous devons d'abord comprendre qu'il existe deux
contains
méthodes surArray
(ou pour mieux dire, sur Type de séquence).avec des contraintes
et
Le premier essentiellement recherches pour un élément donné dans le tableau à l'aide de
==
. Le second utilise une fermeture qui renvoie uneBool
à la recherche pour les éléments.La première méthode ne peut pas être utilisé car
Dog
ne pas adopterEquatable
. Le compilateur essaie d'utiliser la seconde méthode, mais que l'on a une fermeture en tant que paramètre, d'où l'erreur que vous voyez.Solution: mettre en œuvre
Equatable
pourDog
.Si vous êtes à la recherche pour la référence d'objet de comparaison, vous pouvez utiliser une simple fermeture:
Swift
Si vous n'êtes pas à l'aide de l'objet, alors vous pouvez utiliser ce code pour contient.
Si vous utilisez la Classe NSObject en swift. Cette variable est en fonction de mes besoins. vous pouvez modifier pour vos besoins.
C'est pour un même type de données.
Si vous voulez AnyObject type.
Totale de l'état
Cette réponse n'est pas pertinente pour l'OP de la question, mais pourrait être utile à d'autres qui sont confrontés avec la Swift message d'erreur
Mais d'abord un rapide questionnaire: Pouvez-vous repérer le problème ici?
Swift me disait que je ne pouvais pas appeler contient() avec une liste d'arguments de type (Int), qui a été très peu serviable message d'erreur, et je n'ose pas avouer combien de temps il m'a fallu pour enfin comprendre.
Le vrai problème est que Swift du moteur d'inférence ne pouvais pas comprendre ce qu'est le résultat de la méthode contains() doit être - parce que j'avais bêtement pas spécifié "-> Bool" sur le isLocalConnection() signature de la méthode!