是否可以定义自己的键程运营商,如@avg,@sum等..定义自己的关键路径运营商在可可
回答
简答:有点。您可以覆盖valueForKeyPath:
来拦截您的自定义运营商或转发到super
,但这可能会产生问题(我会将解释作为练习留给读者)。
长的答案:是的,你可以,但它依赖于使用私人行为(而不是私人API)。
的NSArray
一些巧妙的反省后,我发现了一些私有方法:
_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!"
它的工作原理,但我不知道我会靠这个,因为它依赖于实现的细节,可能在未来改变。
重写'-valueForKey:'而不是我会。阅读关于NSDictionary如何实现它的文档。 – 2010-11-04 21:53:56
@Mike从长远来看,它可能会更稳定,但重写的问题是这些操作符通常只对集合有用,并且对集合进行子类化很不好。 :( – 2010-11-04 21:56:50
不错,找到戴夫!但是,它看起来像你说的那么脆弱。为什么你认为重写valueForKeyPath:更危险? – cfischer 2010-11-04 22:00:12
它通过重写valueForKeyPath:
,并在那里做你自己的定制逻辑是可能的,但是它没有框架支持。
- 1. 客观c关键路径运营商@ avg,@ max
- 2. 运营商的定义
- 3. 定义单子运营商
- 4. 可可绑定模型关键路径部门
- 5. 阵营路由器4可选路径
- 6. 为自定义控件定义可执行文件的路径
- 7. 未定义的运营商新引用
- 8. 带有''''的类型定义运营商
- 9. 链式rxjs可观察的运营商
- 10. 导入可出租的RxJS运营商
- 11. 如何自定义三元运营商在斯威夫特
- 12. 是否可以将自定义路径追加到Rails路由的“新”路径?
- 13. Arduino未定义引用'运营商
- 14. 斯卡拉 - 运营商定义
- 15. SML/NJ - 关于“:=”运营商
- 16. C++ - ::运营商新的[]和分配我的自定义容器
- 17. 可以专门运营商<<?
- 18. 我可以写反向运营商吗?
- 19. 是否有可能超载“?”运营商?
- 20. 运营商=可能不是会员吗?
- 21. C#运营商和可读性
- 22. 返回可选值有:运营商
- 23. 自定义路径 - 不运行
- 24. 解决运营商歧义
- 25. 运营商的关键字和运算符重载模拟
- 26. 矩阵减少,自定义减少运营商的OpenMP
- 27. 可自定义的Android应用商店
- 28. 运营商新已定义在自定义内存管理器库
- 29. 空 - 结合运营商和运营商&&
- 30. 或运营商与三元运营商
我必须不断努力将'可可'问题发送到烹饪现场...' – 2010-11-04 20:17:40
+1这是一个非常吸引人的问题;一个我从来没有想过要问的问题,但是却揭示了一些非常有趣的信息。感谢问! – 2010-11-04 21:13:15