Как получить случайный объект из экземпляра NSSet? - PullRequest
7 голосов
/ 02 апреля 2012

Я могу получить случайное значение из массива, как структура путем извлечения случайного индекса.

Как я могу получить случайное значение из объекта NSSet, в котором хранятся объекты NSNumber? Я не смог найти метод экземпляра NSSet, который получает случайное значение.

Ответы [ 2 ]

5 голосов
/ 02 апреля 2012

Короче говоря, вы не можете напрямую получить случайный объект из NSSet.

Вам нужно либо превратить набор в массив - во что-то, что имеет индекс, который можно рандомизировать -- путем реструктуризации вашего кода для использования массива, или вы могли бы реализовать это, используя этот бит псевдокода:

randomIndex = ...random-generator....(0 .. [set count]);
__block currentIndex = 0;
__block selectedObj = nil;
[set enumerateObjectsWithOptions:^(id obj, BOOL *stop) {
    if (randomIndex == currentIndex) { selectedObj = obj; *stop = YES }
    else currentIndex++;
 }];
 return selectedObj;

Да - он повторяет набор, потенциально весь набор, при захвате объекта,Тем не менее, эта итерация - в значительной степени то, что произойдет в любом случае при преобразовании в NSArray.Пока набор не такой большой, и вы не называете его , что часто, ничего страшного.

4 голосов
/ 02 апреля 2012

Хотя мне нравится, что ответ @bbum в некоторых случаях прерывается рано из-за использования stop в блоке перечисления.

Для удобства чтения и простоты запоминания того, что происходит при повторном посещении этого кода в будущем, я бы предложил его первое предложение turn the set into an array

NSInteger randomIndex = ..random-generator....(0 .. [set count])
id obj = [set count] > 0 ? [[set allObjects] objectAtIndex:randomIndex] : nil;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...