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

时间:2010-11-15 01:26:06

标签: objective-c

举例如下:

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 个答案:

答案 0 :(得分:5)

如果要对多个属性/对象执行此操作,请使用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];
}

答案 1 :(得分:2)

点语法obj.var = x转换为[obj setVar:x]。因此,要创建方法,要覆盖点 - (void)setVar:...

我做了很多。

答案 2 :(得分:1)

使用属性时,您可以使用setTitle并使用project.title

- (void) setTitle:(NSString *)title;