Динамический доступ к свойству объектов с помощью строки с именем свойства в Objective-C - PullRequest
1 голос
/ 19 октября 2010

У меня есть 2 объекта, AddressBook и AddressCard.Адресная карта имеет имя свойства, адрес электронной почты и день рождения.В AddressBook есть метод поиска, который принимает строку в качестве аргумента и ищет каждую добавленную AddressCard на предмет соответствия.В этом методе поиска я хотел бы иметь NSArray каждого из полей, которые я хотел бы найти в AddressCards.Затем переберите каждую запись AddressBook, проверьте каждое поле в моем массиве на соответствие аргументу поиска.Проблема в том, что я не знаю, как получить динамический доступ к свойству объектов с помощью строки - возможно ли это в Objective-C или мне следует попытаться сделать это по-другому?Я понимаю, что могу просто использовать операторы IF, но это не масштабируемое решение.

Вот мой метод поиска:

-(AddressCard *)lookup:(NSString *)aName
{
    NSArray *fields = [[NSArray alloc] initWithObjects:@"name",@"email",@"birthday",nil];
    BOOL STATUS = NO;
    for(AddressCard *entry in book)
    {

        for(int i = 0; i < [fields count]; i++)
        {
            NSString *fieldName = [[NSString alloc] initWithString:[fields objectAtIndex:i]];
            NSRange range = [[entry fieldName]  rangeOfString:aName];

            if(range.location != NSNotFound)//Important to not directly test the NSRange struct, but one of its properties(BAD_ACCESS)
            {
                NSLog(@"'%@' found in field:%@ at range:%i,%i",aName,fieldName,range.location,range.length);
                STATUS = YES;
                return entry;
            }
            [n release];
        }

    }
    if(!STATUS)
        NSLog(@"'%@' not found in %@ address book",aName, bookName);

    return nil;
}

Любые идеи или предложения приветствуются, спасибо!

1 Ответ

4 голосов
/ 19 октября 2010

Метод, который вы ищете: valueForKey:

NSRange range = [[entry valueForKey:fieldName]  rangeOfString:aName];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...