Objective-C - Есть ли способ "переопределить" синтаксис точки? - PullRequest
1 голос
/ 15 ноября 2010

Возьмем, к примеру, следующее:

Project *project = [[Project alloc] init];
project.title = @"MyProject";
project.field = @"SomeOtherField";

Я хочу установить флаг при каждом изменении свойства. Есть ли способ сделать это, когда измененное свойство выполняется с помощью точечного синтаксиса?

Я мог просто перезаписать

- (void) setValue:(id)value forKey:(NSString *)key

И установить свойства объекта с помощью KVC:

[project setValue:@"SomeOtherField" forKey:@"field"];

Но синтаксис точки всегда выглядит чище;)

Спасибо!

Ответы [ 3 ]

5 голосов
/ 15 ноября 2010

Используйте Key-Value Observing, если вы будете делать это с более чем одним свойством / объектом.

Зарегистрируйтесь как наблюдатель:

[project addObserver:self
          forKeyPath:@"title"
             options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOldKey)
             context:NULL];

Реализуйте изменениеобработчик

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {
   if ([object isKindOfClass:[Project class]] && [keyPath isEqual:@"title"]) {
       //do something with [change objectForKey:NSKeyValueChangeNewKey];
   }

   [super observeValueForKeyPath:keyPath
                        ofObject:object
                          change:change
                         context:context];
}
2 голосов
/ 15 ноября 2010

Синтаксис точки obj.var = x преобразуется в [obj setVar: x]. Таким образом, для переопределения точки достигается создание метода - (void) setVar: ...

Я делаю это много.

1 голос
/ 15 ноября 2010

При использовании свойств вы можете иметь setTitle, и он будет работать с project.title.

- (void) setTitle:(NSString *)title;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...