NSDictionary против пользовательского объекта - PullRequest
18 голосов
/ 21 ноября 2011

Вопрос довольно прост: когда я создаю новый API или класс обслуживания, я должен создать собственный класс для передаваемых объектов или просто придерживаться NSDictionary, который просто хранит данные в ключе -стиль в формате.

Очевидно, что есть плюсы и минусы, но где, по вашему мнению, порог использования одного над другим?

NSDictionary:

+ Нет зависимостей
+ Очень гибкий
+ Обычно используется
+ Встроенная поддержка NSCoding
- Структура не определена -> Ошибки времени выполнения

Пользовательский объект:

+ Структура определена
+ Принадлежности в стиле недвижимости: myObject.someProperty - Может привести к отн. большое количество классов для вложенных объектов

Обновление : включены замечания от jbat100

Ответы [ 3 ]

11 голосов
/ 21 ноября 2011

У меня обычно есть набор моделей доменов, которые лучше подходят к MVC-подходу к разработке iPhone. Наличие определенных объектов также позволяет намного проще обеспечить безопасность типов, а также снижает сложность в долгосрочной перспективе. Если у вас есть NSDictionaries, содержащие NSArrays и другие NSDictionaries и т. Д., И другие, представляющие ваш граф объектов, он может очень быстро стать неуправляемым.

9 голосов
/ 21 ноября 2011

Это действительно зависит от того, насколько вы ожидаете изменения вашей модели данных.Работа с изменениями, когда у вас есть модель данных на основе собственного класса, может быть сложной, особенно если у вас есть архивы (NSCoding) с разными версиями модели (в уже поставленных версиях вашего приложения), вы должны быть очень осторожны, чтобы обеспечить обратную совместимость иизбежать неприятных сюрпризов во время выполнения.В этом отношении модели, основанные на NSDictionary, как вы говорите, более гибкие.Однако они не допускают все настраиваемые проверки и поведение, которые делают пользовательские классы.Кроме того, пользовательские классы делают модель данных более явной для кодеров, незнакомых с кодом, по моему опыту, разработчики часто бывают неаккуратными (особенно неопытными) при работе с моделями на основе NSDictionary, что может быстро привести к непонятному беспорядку, поэтому, если вы уйдете внизмаршрут, документ хорошо и быть дисциплинированным!

4 голосов
/ 21 ноября 2011

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

@interface NSDictionary (MyClassCategory)
-(NSString*) someField;
@end

@implementation NSDictionary (MyClassCategory)
-(NSString*) someField {
    return [self objectForKey:@"someField"];
}
@end

typedef NSDictionary MyClass;

И использовать его:

 MyClass* myClass = ...;
    NSString* value = [myClass someField];
...