NSSet utilise la méthode isEqual : (que les objets que vous placez dans cet ensemble doivent surcharger, en plus de la méthode hash) pour déterminer si un objet se trouve à l'intérieur de celui-ci.
Ainsi, par exemple, si vous avez un modèle de données qui définit son unicité par une valeur d'identification (disons que la propriété est :
@property NSUInteger objectID;
alors vous implémenteriez isEqual : en tant que
- (BOOL)isEqual:(id)object
{
return (self.objectID == [object objectID]);
}
et vous pourriez implémenter le hachage :
- (NSUInteger)hash
{
return self.objectID; // to be honest, I just do what Apple tells me to here
// because I've forgotten how Sets are implemented under the hood
}
Ensuite, vous pouvez obtenir un objet avec cet ID (ainsi que vérifier s'il est dans le NSSet) avec :
MyObject *testObject = [[MyObject alloc] init];
testObject.objectID = 5; // for example.
// I presume your object has more properties which you don't need to set here
// because it's objectID that defines uniqueness (see isEqual: above)
MyObject *existingObject = [mySet member: testObject];
// now you've either got it or existingObject is nil
Mais oui, la seule façon d'obtenir quelque chose d'un NSSet est de considérer ce qui définit son unicité en premier lieu.
Je n'ai pas testé ce qui est plus rapide, mais j'évite d'utiliser l'énumération parce que cela pourrait être linéaire alors que l'utilisation de la méthode member : serait beaucoup plus rapide. C'est l'une des raisons pour lesquelles je préfère l'utilisation de NSSet plutôt que de NSArray.
1 votes
[[nsSetObjects allObjects] objectAtIndex: anyInteger]