Если вы не можете получить объект с objectAtIndex: из NSSet, то как вы извлекаете объекты?
Получение объекта из NSSet
Ответ 1
Существует несколько вариантов использования набора. Вы можете перечислить (например, enumerateObjectsUsingBlock
или NSFastEnumeration), вызвать containsObject
, чтобы проверить членство, используйте anyObject
, чтобы получить член (не случайный) или преобразовать его в массив ( в определенном порядке) с allObjects
.
Набор подходит, если вы не хотите дубликатов, не заботитесь о порядке и хотите быстро тестировать членство.
Ответ 2
NSSet не имеет метода objectAtIndex:
Попробуйте вызвать allObjects, который возвращает NSArray всех объектов.
Ответ 3
можно использовать filterSetUsingPredicate, если у вас есть какой-то уникальный идентификатор для выбора нужного вам объекта.
Сначала создайте предикат (если ваш уникальный идентификатор в объекте называется "идентификатор" и это NSString):
NSPredicate *myPredicate = [NSPredicate predicateWithFormat:@"identifier == %@", identifier];
И затем выберите объект, используя предикат:
NSObject *myChosenObject = [mySet filteredSetUsingPredicate:myPredicate].anyObject;
Ответ 4
NSArray *myArray = [myNSSet allObjects];
MyObject *object = [myArray objectAtIndex:(NSUInteger *)]
замените NSUInteger на индекс вашего желаемого объекта.
Ответ 5
NSSet использует метод isEqual: (который объекты, которые вы помещаете в этот набор, должны переопределять, кроме того, хеш-метод), чтобы определить, находится ли внутри него объект.
Итак, например, если у вас есть модель данных, которая определяет ее уникальность по значению id (скажем, свойство:
@property NSUInteger objectID;
то вы бы выполнили isEqual: как
- (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
}
Затем вы можете получить объект с этим ID (а также проверить, есть ли он в 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 objectID that defines uniqueness (see isEqual: above)
MyObject *existingObject = [mySet member: testObject];
// now you've either got it or existingObject is nil
Но да, единственный способ получить что-то из NSSet - это рассмотреть то, что определяет его уникальность в первую очередь.
Я не тестировал, что быстрее, но я избегаю использования перечисления, потому что это может быть линейным, тогда как использование метода member: будет намного быстрее. Это одна из причин предпочитать использование NSSet вместо NSArray.
Ответ 6
Для Swift3 и iOS10:
//your current set
let mySet : NSSet
//targetted index
let index : Int
//get object in set at index
let object = mySet.allObjects[index]
Ответ 7
for (id currentElement in mySet)
{
// ** some actions with currentElement
}