Получение объекта из NSSet

Если вы не можете получить объект с objectAtIndex: из 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 
}