Подтвердить что ты не робот

NSDictionary против пользовательского объекта

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

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

NSDictionary:

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

@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];