是否可以定義自己的鍵程運營商,如@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