Как написать функцию или макрос для "oneOf" ... приведение в variadics? - PullRequest
0 голосов
/ 07 февраля 2011

Примечание - используя переменные аргументы, Phix предоставил супер решение ниже.Однако он выдает предупреждения компилятора при использовании с целыми числами, поскольку вы приводите их к идентификатору, и он не будет работать, например, с плавающей точкой.

Вопрос - как написать средство, которое выбирает один элемент из списка?В идеале это было бы максимально гибко в отношении типа предметов / объектов / чего угодно в списке.

Пример использования:

NSInteger openingMap = [utilities oneOf:1, 2, 3, 7, 8];

initialAngle =oneOf(1.25, 1.75, 1.95, 2.00, 2.01);

self.spaceShipNickName =oneOf(@"Blaster",@"Blitzen",@"Stardancer",@"Quantum");

self.chassisProperty = oneOf(titanium, neutronium, unavailablium);

[fireworksLayer paintStars:oneOf(blue,green,white) howMany:oneOf(20,25,50)];

[trump chooseDefaultSuite:oneOf(diamonds,hearts,clubs,spades)];

// normally have a few explosions, but, occasionally have a huge display...
explosionCount = oneOf( 2,2,2,3,4,1,28,3,3,3,70 );

Обратите внимание, что некоторыепримерами являются целые числа, некоторые перечисления, некоторые строки NSS и т. д. Итак, еще раз, было бы наиболее впечатляющим, если бы одно средство могло обрабатывать разные типы.(Вместо, возможно, связанной группы, например ... oneOfIntegers, oneOfStrings, oneOfObject и т. Д.)

Само собой разумеется, что для выбора случайного элемента просто используйте ...
= arcrandom ()% number-of-items

Вы можете использовать метод или класс Objective C, функцию ac или некоторую систему макросов, расширение категории до NSMutableArray или даже блоки - или что-то еще. Он должен быть максимально гибким для широкого использования в любом месте типичного проекта iOS или Mac ... какие-нибудь идеи?

Ответы [ 2 ]

2 голосов
/ 07 февраля 2011
#define NUMARGS(...)  (sizeof((id[]){__VA_ARGS__})/sizeof(id))
#define ONEOF(...)  (oneOf(NUMARGS(__VA_ARGS__), __VA_ARGS__))

id oneOf(int numargs, ...) {
    va_list ap; 
    va_start(ap,numargs);
    int i = arc4random() % numargs;
    id val = nil;
    do {
        val = va_arg(ap, id);
    } while (i--);
    va_end(ap);
    return val; 
}

Использование:

NSLog(@"%@", ONEOF(@"Blaster",@"Blitzen",@"Stardancer",@"Quantum"));
NSLog(@"%d", ONEOF( 2,2,2,3,4,1,28,3,3,3,70 ));

Обратите внимание, что оба работают, однако последний выдает некоторые предупреждения компилятора.

2 голосов
/ 07 февраля 2011

Я бы поставил его в качестве категории на NSArray (предупреждение - этот код не тестировался и, возможно, в нем встречаются ошибки "!")

NSString *thingy = [[NSArray arrayWithObjects:@"1", @"2", @"3"] anyObject];

NB. Для обработки чисел (и других собственных типов и т. Д.) Вы должны сделать их объектами, например

NSInteger number = [[[NSArray arrayWithObjects:
                      [NSNumber numberWithInteger:1],
                      [NSNumber numberWithInteger:2],
                      [NSNumber numberWithInteger:3], nil] anyObject] intValue];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...