Я пытаюсь найти «правильный» способ обработки массива с помощью кодирования значения ключа для приложения iPhone. Я придумал что-то, что работает, но это довольно хакерское. По сути, я разбираю XML-документ на набор сгенерированных моделей. Давайте предположим, что XML имеет этот формат:
<foo>
<bar>
<item name="baz" />
<item name="bog" />
</bar>
</foo>
В моем сгенерированном объекте, который представляет элемент Bar, у меня есть NSMutableArray, определенный для подузла:
@interface Bar : NSObject {
NSMutableArray *item;
}
@end
Таким образом, по умолчанию, когда я вызываю setValue: forKey: для экземпляра Bar, он перезаписывает экземпляр NSMutableArray одним экземпляром объекта Item. То, что я в настоящее время сделал, чтобы заставить это работать, - то, где это становится хакерским. Я переименовал переменную экземпляра массива, чтобы она стала чем-то другим, скажем, во множественном числе имени:
@interface Bar : NSObject {
NSMutableArray *items;
}
@end
Это заставляет метод доступа по умолчанию для setValue: forKey: пропустить. Затем я добавил этот метод к реализации Bar:
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
if([key isEqualToString:@"item"]) {
if(items == nil) {
items = [[NSMutableArray alloc] init];
[items retain];
}
[items addObject:value];
}
}
И все работает! Я уверен, что должен быть лучший способ сделать это все же! Я прочитал Руководство по программированию Key-Value Coding, но я должен что-то упустить, потому что мне неясно, как все должно работать для методов доступа к массивам. Я попытался реализовать countOf: и objectInAtIndex: так, как они указывают в руководстве по программированию KVC, но это все равно приводит к тому, что мой NSMutableArray перезаписывается экземпляром типа Item.