Короче говоря, вы не можете напрямую получить случайный объект из 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.Пока набор не такой большой, и вы не называете его , что часто, ничего страшного.