Objective-C - 有没有办法"覆盖"点语法?

mmi*_*ilo 1 objective-c

举个例子如下:

Project *project = [[Project alloc] init];
project.title = @"MyProject";
project.field = @"SomeOtherField";
Run Code Online (Sandbox Code Playgroud)

我想在更改属性时设置标志.当通过点语法完成属性更改时,有什么办法可以做到这一点?

我可以覆盖

- (void) setValue:(id)value forKey:(NSString *)key
Run Code Online (Sandbox Code Playgroud)

并使用KVC设置对象属性:

[project setValue:@"SomeOtherField" forKey:@"field"];
Run Code Online (Sandbox Code Playgroud)

但点语法总是看起来更干净;)

谢谢!

Jac*_*kin 5

Key-Value Observing如果您要使用多个属性/对象,请使用此选项.

注册为观察员:

[project addObserver:self
          forKeyPath:@"title"
             options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOldKey)
             context:NULL];
Run Code Online (Sandbox Code Playgroud)

实现更改处理程序

- (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];
}
Run Code Online (Sandbox Code Playgroud)