NSSet использует метод isEqual: (который объекты, которые вы помещаете в этот набор, должен переопределять, кроме того, метод хэширования), чтобы определить, находится ли объект внутри него.
Так, например, если выиметь модель данных, которая определяет ее уникальность по значению id (скажем, свойство:
@property NSUInteger objectID;
, тогда вы реализуете isEqual: as
- (BOOL)isEqual:(id)object
{
return (self.objectID == [object objectID]);
}
, и вы можете реализовать хеш:
- (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
}
Затем вы можете получить объект с этим идентификатором (а также проверить, находится ли он в NSSet) с помощью:
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
Но да, единственный способ получитьчто-то из NSSet заключается в рассмотрении того, что в первую очередь определяет его уникальность.
Я не проверял, что быстрее, но я избегаю использования перечисления, потому что оно может быть линейным, тогда как использование member: method будетнамного быстрее. Это одна из причин, по которой вы предпочитаете использовать NSSet вместо NSArray.