26

クラスタイプでフィルタリングする述語を作成する方法はありますか?

現在、配列をループして、各オブジェクトのクラスを確認しています。たぶんもっときれいな方法がありますか?

4

3 に答える 3

77

述語でクラスを直接比較することもできます。

ただし、クラスクラスタに属するオブジェクトをフィルタリングしようとしている場合、またはサブクラスがある場合は、おそらく期待どおりに機能しません。

たとえば、NSDateインスタンス化された場合、通常はで__NSCFDateあり、他の特定のプライベートクラスと同様にNSStringなります。NSCFString

自分でセットをループし-isKindOfClass:てテストとして使用する方がおそらく良いでしょう。

あなたがこれをすることができるけれどもあなたが本当に使いたいならNSPredicateば。例として、これはから派生したすべてのオブジェクトの配列をフィルタリングしますNSString。厳密なクラスメンバーシップが必要な場合は、に置き換えることができisKindOfClass:ますisMemberOfClass:

ただし、コレクション内のすべてのオブジェクトが実装し、1つの引数を取り、aを返すセレクターは機能するBOOLはずです。

NSArray *mixedArray = {...};
NSPredicate *predicate = [NSPredicate predicateWithFormat:
                                      @"self isKindOfClass: %@",
                                      [NSString class]];

NSLog(@"%@", [mixedArray filteredArrayUsingPredicate:predicate]);
于 2010-03-31T20:37:00.980 に答える
24

次のように、「cf_className」メソッドを追加するカテゴリを NSObject に追加できます。

@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 にはその方法がないため、カテゴリが必要です。

于 2010-03-31T17:28:42.023 に答える