回答
你可以添加一個類別以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. 是否可以過濾extjs圖表?
- 3. NSArray的過濾
- 4. 是否可以按XPath中的命名空間進行過濾?
- 5. 分頁前是否可以按條件進行過濾?
- 6. 是否可以在Typescript中按值過濾Map?
- 7. 使用NSPredicate按關鍵字過濾NSArray
- 8. 從JSON過濾NSArray?
- 9. JQUERY CSS:是否可以通過JQuery觸發css過濾器?
- 10. Leaflet.js:是否可以通過屬性過濾geoJSON功能?
- 11. 如果列是列表,是否可以過濾Pandas DataFrame列?
- 12. 是否可以在Solr中對過濾器列表進行過濾?
- 13. 用NSObject內部過濾NSArray
- 14. 過濾文件的NSArray?
- 15. 過濾NSArray的對象
- 16. 過濾NSArray的使用NSPredicate
- 17. 使用NSPredicate過濾NSArray
- 18. 是否可以使用下劃線按多個值過濾數組值?
- 19. 是否可以在Excel 2008 for Mac中按日期進行過濾?
- 20. Fiddler Web調試器 - 是否可以按協議過濾(即HTTP/HTTPS)?
- 21. SQL - 您可以按數據類型過濾嗎?
- 22. 子類是否也可以是超類?
- 23. 是否可以爲多種擴展類型設置文件過濾器?
- 24. Zend_File_Transfer是否可以處理同一類的兩個不同的過濾器?
- 25. 是否可以添加類?
- 26. 是否可以擴展類
- 27. django過濾器:可以過濾元組?
- 28. 過濾器是否可以從我的BaseController訪問屬性?
- 29. 是否可以過濾OData導航屬性?
- 30. 是否可以過濾通知誰提出了拉取請求?
爲什麼你把這些不同的物體放在同一個數組中? – 2010-04-02 13:58:13