回答
你可以添加一個類別以NSObject中,增加了一個 「cf_className」 的方法,像這樣:
@interface NSObject (CFAdditions)
- (NSString *) cf_className;
@end
@implementation NSObject (CFAdditions)
- (NSString *) cf_className {
return NSStringFromClass([self class]);
}
@end
從那裏,你可以使用謂詞這樣的:如果你在
NSPredicate * p = [NSPredicate predicateWithFormat:@"cf_className = %@", aClass];
NSArray * filtered = [anArray filteredArrayUsingPredicate:p];
在Mac中,您只需使用-[NSObject className]
而不必創建類別。 iPhone沒有這種方法,因此需要一個類別。
你也可以做self.class.description – 2012-01-12 18:23:59
@BrianKing優秀點 – 2012-01-12 18:55:33
您可以直接在謂詞中比較類。
但是,如果您嘗試過濾屬於類集羣的對象或者您有子類,它可能不會如您所期望的那樣工作。
例如,NSDate
在實例化時通常是__NSCFDate
和NSString
可以是NSCFString
以及其他特定的私有類。
這可能是更好的只是循環通過設置,並使用-isKindOfClass:
作爲測試。
IF你真的想用NSPredicate
但你可以做到這一點。作爲一個例子,這將過濾來自NSString
的所有對象的數組。如果您想要嚴格的班級會員資格,您可以用isMemberOfClass:
替換isKindOfClass:
。
集合中所有對象實現的任何選擇器都帶有一個參數並返回BOOL
應該可以工作。
NSArray *mixedArray = {...};
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"self isKindOfClass: %@",
[NSString class]];
NSLog(@"%@", [mixedArray filteredArrayUsingPredicate:predicate]);
+1我從來沒有想過把選擇器直接放在謂詞中。整齊! – 2010-04-01 04:27:08
「謂詞編程指南」中沒有提及它(這意味着在格式字符串中進行此操作在技術上沒有記錄),但自定義選擇器功能由參考進行備份:http://developer.apple.com/mac/library/ documentation/Cocoa/Reference/Foundation/Classes/NSComparisonPredicate_Class/Reference/NSComparisonPredicate.html#// apple_ref/occ/clm/NSComparisonPredicate/predicateWithLeftExpression:rightExpression:customSelector:Very cool。 – 2010-04-02 14:00:24
是的,我原本寫了很長的一段路,但是百靈在格式化字符串中試了一下,很驚訝地看到它的工作。 – 2010-04-02 16:01:25
從iOS 4和Mac OS 10.6開始,也可以使用+[NSPredicate predicateWithBlock:]
。例如:
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary *bindings) {
return [object isKindOfClass:[NSString class]];
}];
這可以讓你純粹表達自己的謂詞在Objective-C,而不是由predicateWithFormat:
所需的謂詞的語法。
這一個值得更多的選票 – 2014-07-30 15:28:12
- 1. 是否可以在Open Extensions上過濾?
- 2. NSArray的過濾
- 3. 是否可以在Typescript中按值過濾Map?
- 4. 分頁前是否可以按條件進行過濾?
- 5. 使用NSPredicate按關鍵字過濾NSArray
- 6. 從JSON過濾NSArray?
- 7. JQUERY CSS:是否可以通過JQuery觸發css過濾器?
- 8. 用NSObject內部過濾NSArray
- 9. 過濾NSArray的對象
- 10. 過濾文件的NSArray?
- 11. 是否可以在Solr中對過濾器列表進行過濾?
- 12. SQL - 您可以按數據類型過濾嗎?
- 13. Zend_File_Transfer是否可以處理同一類的兩個不同的過濾器?
- 14. 是否可以爲多種擴展類型設置文件過濾器?
- 15. 是否可以擴展類
- 16. 是否可以添加類?
- 17. 我們是否可以有基於條件的過濾器
- 18. 過濾器是否可以從我的BaseController訪問屬性?
- 19. 是否可以在Linq to SQL中使用自動過濾器?
- 20. 是否可以使用XSLT樣式表過濾重複記錄?
- 21. 是否可以使用url參數過濾dbpedia結果?
- 22. 是否可以在Django註釋中的相關項上過濾?
- 23. 是否可以從角度過濾器輸出html?
- 24. DbContext是否可以執行過濾器策略?
- 25. 輸出中的XSS過濾...是否可以?
- 26. 是否可以綁定多個控件來過濾一個NSArrayController?
- 27. 是否可以創建控制器過濾器?
- 28. 是否可以從AppEngine上的servlet過濾器登錄?
- 29. 上傳到Tableau Public的工作簿是否可以過濾?
- 30. Django管理GUI可以過濾文本字段是否爲空?
爲什麼你把這些不同的物體放在同一個數組中? – 2010-04-02 13:58:13