objective-c - 在 Cocoa 中定义自己的关键路径运算符

标签 objective-c cocoa key-value-coding

是否可以定义自己的关键路径运算符,例如@avg、@sum 等……

最佳答案

简答:有点。您可以重写 valueForKeyPath: 以拦截您的自定义运算符或转发到 super,但这可能会有问题(我将把对此的解释作为练习留给读者).

长答案:是的,你可以,但它依赖于使用私有(private)行为(而不是私有(private) api)。

在对 NSArray 进行一些简洁的自省(introspection)之后,我发现了一些私有(private)方法:

_distinctUnionOfSetsForKeyPath:
_distinctUnionOfObjectsForKeyPath:
_distinctUnionOfArraysForKeyPath:
_unionOfSetsForKeyPath:
_unionOfArraysForKeyPath:
_unionOfObjectsForKeyPath:
_minForKeyPath:
_maxForKeyPath:
_countForKeyPath:
_avgForKeyPath:
_sumForKeyPath:

好吧,整洁!这些方法似乎与可用于集合的运算符匹配:@sum@min@max@distinctUnionOfObjects 等。@ 已替换为下划线,并且我们附加了 ForKeyPath:

所以看起来我们可以创建一个新方法来匹配适当的签名,我们很高兴。

所以:

@interface NSArray (CustomOperator)

- (id) _fooForKeyPath:(NSString *)keyPath;

@end

@implementation NSArray (CustomOperator)

- (id) _fooForKeyPath:(NSString *)keyPath {
  //keyPath will be what comes after the keyPath.  In this example, it will be "self"
  return @"Hello world!";
}

@end

NSArray * array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];
NSLog(@"%@", [array valueForKeyPath:@"@foo.SELF"]); //logs "Hello world!"

它有效,但我不确定我是否会依赖它,因为它依赖于将来可能会改变的实现细节。

关于objective-c - 在 Cocoa 中定义自己的关键路径运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4100458/

相关文章:

objective-c - 在 Swift 中实现的 Objective-C 回调

ios - 核心数据-如何访问实体属性?

cocoa - 矩阵乘法给出错误的结果

objective-c - cocoa PDFView,setDocument,如何将文档旋转90度?

objective-c - setNilValueForKey 错误

ios - 当我在数组中创建一些 block 时,为什么索引 0 不应该被复制?

ios - 从 Xcode 打印的字典日志创建 NSDictionary

ios - 后退按钮未出现在导航 Controller 上

swift - 检查[字符串: AnyObject] dictionary for a list of keys with values of specific types?

objective-c - 创建一个使用相同接口(interface)包装另一个对象的 Objective-C 对象 - KVC/KVO 问题