Как отметить, что не-объектное свойство не было установлено? - PullRequest
2 голосов
/ 24 апреля 2011

Например, у меня есть такие свойства:

@property (nonatomic, assign) CGFloat startValue;
@property (nonatomic, assign) BOOL running;

Это каскадная система, похожая на CSS, которая наследует значения, если они явно не изменены. Тем не менее, есть класс, описывающий все состояние. Он должен иметь свойства практически для всего. Можно изменить некоторые значения в иерархии, чтобы переопределить унаследованные, просто изменив некоторые свойства. Это цепочка примеров.

Проблема: с этим дизайном невозможно определить, переопределяет ли свойство значение из «главного объекта» или нет.

Мне нужен безопасный способ пометить, было ли свойство явно установлено на что-то или нет. Для CGFloat я мог бы сказать, что если значение <-99999, оно не установлено явно, и мы просто используем значение главного объекта. Но как насчет BOOL? </p>

Я также могу забыть о свойствах и переключиться на словари. Они позволяют перебирать ключи, поэтому я могу легко применить только изменения. Но они - боль в заднице, чтобы использовать повсеместно. Вот почему я хочу простой класс, где я могу просто установить свойства. Более простой в использовании, без уродливой и тяжелой упаковки значений в объектах NSNumber.

Я уверен, что есть разумные способы сделать это.

1 Ответ

2 голосов
/ 24 апреля 2011

Есть несколько способов сделать это:

  • Для случая BOOL вы могли бы просто использовать int и определить, что 1 эквивалентно YES, 0 эквивалентно NO, а -1 эквивалентно неустановленному.

  • Кроме того, вы можете использовать указатели на эти типы. Указатель NULL будет означать, что значение не было установлено; указатель, отличный от NULL, будет указывать, что значение установлено и значение доступно по адресу, сохраненному в указателе. Вам придется управлять памятью способом C (malloc(), free()).

  • Вы можете поместить ваши числовые типы в экземпляры NSNumber. Как и в предыдущем случае, если свойство равно nil, оно не было установлено; в противном случае распакуйте соответствующее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...