как сохранить ссылку на, а затем использовать extern NSString const? - PullRequest
1 голос
/ 18 ноября 2011

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

это словари ключ / значение NSStrings, например: kABEmailProperty/email.

я хочу иметь возможность использовать распакованный plist для сбора значений из указанного ABRecord путем перечисления распакованного словаря plist (предположим, что inRecord является ABRecord) :

__block NSMutableArray *valueGroup = [[NSMutableArray alloc] init];

[self.propsDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSString *valueString = [inRecord valueForProperty:key];
        if (valueString) { 
            NSDictionary *dict = [NSDictionary dictionaryWithObject:valueString forKey:obj];
            [valueGroup addObject:dict];    
                }
            }
        }];

как мне правильно ссылаться на ключ , чтобы в ABGlobals.h содержалась глобальная ссылка на свойство ABRecord вместо строки , которая хранится в plist?

Я пытался использовать & key, и (id) key, и (void *) key, но на самом деле я просто колеблюсь вокруг.

Мне не удалось найти ответы на различные вопросы об использовании глобальных внешних ссылок, хотя это было информативно.

1 Ответ

0 голосов
/ 19 ноября 2011

Если я вас правильно понимаю, у вас есть следующее:

NSString *foo = "kABEmailProperty";

И вы хотите иметь возможность сделать что-то вроде этого:

[inRecord valueForProperty:kABEmailProperty];

На основе значения foo.Правильный?Нет никакого способа сделать это напрямую, потому что имя «kABEmailProperty» не (легко) доступно во время выполнения;это просто имя времени компиляции.

Я бы предложил создать словарь со всеми ключами в нем;что-то вроде этого:

NSDictionary *keys = [NSDictionary dictionaryWithObjectsAndKeys:kABEmailProperty, @"kABEmailProperty", kABOtherProperty, @"kABOtherProperty", ..., nil];

И тогда вы можете сделать что-то вроде этого:

[inRecord valueForProperty:[keys objectForKey:foo]];

т.е. сделать сопоставление из строки@"kABEmailProperty" до значения, которое kABEmailProperty действительно имеет.

...