Может быть, это может быть начало:
@interface NSObject (LazyKVC)
- (id)lazyValueForKey:(NSString *)key;
@end
@implementation NSObject (LazyKVC)
- (id)lazyValueForKey:(NSString *)key {
id value = [self valueForKey:key];
if (!value) {
// Now, look for the type of property named |key|.
// To spare you the details of the @encode() string, use
// [self typeOfPropertyNamed:key] - see link provided below
NSString className = [NSString stringWithUTF8String:
[self typeOfPropertyNamed:key]];
Class propertyClass = NSClassFromString(className);
if (propertyClass) {
value = [[propertyClass alloc] init];
}
}
return value;
}
@end
Примечание:
- Приведенный выше код использует
- (const char *)typeOfPropertyNamed:(NSString *)name
, , доступное здесь . - Я опустил угловые случаи (исправление ошибок и т. Д.).
Использование будет:
[foo lazyValueForKey:@"bar"];
Мне интересно, если вы можете заставить его работать так (я написал это прямо в окне браузера ...)
Примечание о внедрении (зависимости)
Чтобы ваш метод мог возвращать нужный объект во время выполнения (посредством внедрения), вам понадобится - в качестве начальной точки -следующее:
- файл конфигурации (чтобы указать
lazyValueForKey:
, откуда инициализировать внедренный объект, например, plist) - соглашение: как вы будете называть этот файл конфигурации так
lazyValueForKey:
найдет его - метод, который позволит вам искать и инициализировать объект из файла конфигурации (например, какие поля и атрибуты вы включите в файл конфигурации для описания объектов).
- изменить метод
lazyValueForKey:
для эффективной десериализации / чтения объектов из файла конфигурации
Обратите внимание, что пункты 1-2-3 выше могут привести вас к абстракцииданные внедрения зависимостиисточник, который будет управлять конфигурацией ваших внедренных объектов и предоставлять вам их во время выполнения.
Я, конечно, здесь упускаю другие важные моменты, но я считаю, что это начинает выходить за рамки вашего первоначального вопроса, поэтому я не буду продолжать с моим ответом.Реализация механизма внедрения зависимостей - нелегкая задача.Тем не менее, вы можете найти больше информации на этот хороший вопрос SO .