Повышение надежности setValueForKeyPath - PullRequest
0 голосов
/ 11 июля 2011

Я создал расширение для NSObject, чтобы можно было задавать свойства объекта из данных, содержащихся в PLIST или словаре.Я использовал setValuesForKeysWithDictionary, но это работает только для ключей, а не keyPaths.Мое расширение делает то же самое, за исключением того, что позволяет PLIST содержать ключевые пути, а также ключи.Например, detailTextLabel.text @ "подробный текст" в качестве пары ключ-значение.

Это работает хорошо, за исключением того, что возможно сбой приложения из-за опечатки в PLIST.Например, произойдет сбой, если имя свойства существует, но имеет другой ожидаемый тип (например, число вместо строки).Каков наилучший способ сделать это более надежным и защищать код, чтобы избежать подобных ошибок?

Я уже использую - (void) setValue:(id)value forUndefinedKey:(NSString *)key {} в своих объектах для захвата элементов в PLIST, которые не соответствуют фактическим ключам.

#pragma mark -
#pragma mark Extensions to NSObject

@implementation NSObject (SCLibrary)

- (void) setValuesForKeyPathsWithDictionary:(NSDictionary *) keyPathValues {
    NSArray *keys;
    int i, count;
    id key, value;

    keys = [keyPathValues allKeys];
    count = [keys count];
    for (i = 0; i < count; i++)
    {
        key = [keys objectAtIndex: i];
        value = [keyPathValues objectForKey: key];

        [self setValue:value forKeyPath:key];
    }
}

Заранее спасибо, Дейв.

1 Ответ

3 голосов
/ 04 августа 2011

Добавлен общий @try/@catch вокруг setValue:forKeyPath:

@try {
    [self setValue:value forKeyPath:key];
}
@catch (NSException * e) {
    NSLog(@"%@",e);
}

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

Приму этот ответ, если лучшего ответа нет.

...