Я часто сталкиваюсь с такими вариантами дизайна и немного борюсь; Я ищу некоторые другие перспективы.Лучшая альтернатива объектам Objective-C только для данных?
Я часто хочу сохранять списки или передавать куски состояния, которые в основном представляют собой только набор значений. Значения, как правило, являются примитивными типами: поплавками, NSTimeIntervals, CGPoints и т. Д.
Моим первым наклонением часто является создание структур C для этих наборов свойств, например.
typedef struct _STATE {
float foo;
NSTimeInterval elapsed;
CGPoint point;
} STATE;
т.д.
Но C структуры не дружат с родной коллекции классов какао (NSArray
, NSSet
, NSDictionary
), и используя overmany их отслеживать множество из состояния чувствует, как он работает против зерно остатка моего кода, совместимого с какао, - я получаю и управляю массивами структур, а также передаю строковые указатели в сообщениях и т. д.
С другой стороны, поскольку необработанная производительность не обязательно критическая , Я мог кодировать эти значения в NSDictionary, обертывая их все в NSValue
или NSNumber
, но полученный синтаксис вряд ли немногословен, и немного хрупкий, требуя тип и имя корректность во время выполнения как для вставки и поиска:
[stateDict setObject:[NSNumber numberWithFloat:foo] forKey:@"bar"];
...
float something = [[stateDict objectForKey:@"bar"] floatValue];
и некоторых видов, как NSTimeInterval, только в состоянии использовать с некоторым (спорным) хакером (в этом случае приведение типа к двойному).
Наконец, я мог бы создавать объекты контейнера только для данных, с частными данными-членами и только с геттерами/сеттерами. (Они будут называться «beans» на Java.) Они более сложны для доступа, чем словари, более Cocoa, чем структуры, но мне кажется, что это излишний, особенно если мне нужны только они как «внутренние классы», которые используются для управления состоянием внутренний для одного типа объекта.
Как вы, отличное программирование какао, публично, сделайте это?
+1.Создание классов моделей - это почти всегда путь, если у вас нет кода с очень высокой критичностью, когда накладные расходы на использование объектов могут вызвать проблемы. –
Спасибо за это Matt. В этом случае вам даже не нужно обертывать float с помощью NSNumber - для доступа к примитивным типам можно использовать синтаксис @property. (Конечно же, для NSTimeInterval, который является примитивным поплавком typedef'd.) –