3
特定類型的所有對象,我知道我能做到優雅的方式來獲得一個Objective-C陣列
for (id obj in array)
{
if ([obj isKindOfClass:[Elephant class]])
[elephants addObject:obj];
}
,但我覺得必須有這樣做的更優雅的方式。我看過濾數組,但不能提出一個好的謂詞。思考?
特定類型的所有對象,我知道我能做到優雅的方式來獲得一個Objective-C陣列
for (id obj in array)
{
if ([obj isKindOfClass:[Elephant class]])
[elephants addObject:obj];
}
,但我覺得必須有這樣做的更優雅的方式。我看過濾數組,但不能提出一個好的謂詞。思考?
謂詞會是這樣的
Class ec = [Elephant class];
NSPredicate *elePred = [NSPredicate predicateWithFormat:@"class==%@", ec];
NSArray *elephants = [array filteredArrayUsingPredicate:elePred];
或
NSPredicate *elePred = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", ec];
我發現謂詞是相當的,呃..應該說 「重」。我可能會更喜歡你的代碼。
如果你只是希望可以豐富您的生活一點點,你可以使用數據塊加少許併發...
NSMutableArray *results = [NSMutableArray array];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
if([obj isKindOfClass:[Elephant class]])
[results addObject:obj];
}];
您可以創建類別NSMutableArray
並添加下一個方法:
- (void)addObject:(id)anObject ifItIsKindOfClass:(Class) classObj {
if ([anObject isKindOfClass:classObj]) {
[self addObject:anObject];
}
}
而簡單的寫:
for (id obj in array)
{
[elephants addObject:obj ifItIsKindOfClass:[Elephant class]];
}
有一個加號:可重複使用。
我把它放在C函數中。不需要它是數組類的實例成員,甚至不需要靜態成員。將它添加到NSMutableArray似乎毫無意義,因爲它對其他類型的數組也同樣適用。 – 2010-04-23 15:17:36