Цель-C: Использование переменной NSString для отправки сообщения одному из множества объектов - PullRequest
0 голосов
/ 09 июля 2011

Я буду использовать пример из JavaScript, чтобы прояснить мой вопрос. Предположим, у меня есть следующий объект:

sports = {
   soccer: {...},
   basketball: {...},
   baseball: {...}
}

Если в какой-то момент в моем скрипте есть переменная sportString, которая просто содержит строку, я могу динамически вызывать один из спортивных объектов следующим образом:

sports[sportString];

Это освобождает меня от необходимости использовать кучу вложенных операторов if, проверяя значение строки, например:

if(sportString === 'soccer'){
    sports.soccer;
}else if(sportString === 'basketball){....

Итак, мой вопрос: как я могу выполнить нечто похожее на sports [sportString] в Objective-C, если sportString является объектом NSString?

Ответы [ 3 ]

6 голосов
/ 09 июля 2011

Используйте NSDictionary в качестве спортивного объекта.Тогда вы можете сделать поиск, как это:

[sports objectForKey: sportsString];
4 голосов
/ 09 июля 2011

Люди, которые говорят, что вы должны использовать NSDictionary для общего хранения ключей / значений, на 100% правы.Тем не менее, я думаю, что полезно знать, что вы можете вызвать сообщение, указанное в строке:

SEL selector = NSSelectorFromString(@"foo"); // Or @selector(foo) if you know it at compile time
id value = [object performSelector:selector];

Вы также можете использовать селекторы с двумя аргументами, если они занимаютobjects:

SEL selector2 = NSSelectorFromString(@"setFoo:");
[object performSelector:selector2 withObject:value];

Можно вызывать произвольные методы, используя IMP s или приведение objc_msgSend(), но теперь я выхожу за рамки вашего реального вопроса.: -)

3 голосов
/ 09 июля 2011

Ваш объект JavaScript sports обычно будет NSDictionary или NSMutableDictionary.Пример:

NSMutableDictionary *sports = [NSMutableDictionary dictionary];
[sports setObject:@"Foo" forKey:@"soccer"];
[sports setObject:@"Bar" forKey:@"basketball"];

NSString *sportString = @"soccer";
NSString *sportValue = [sports objectForKey:sportString];
NSLog(@"%@", sportValue); //logs "Foo"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...