クラスタイプでフィルタリングする述語を作成する方法はありますか?
現在、配列をループして、各オブジェクトのクラスを確認しています。たぶんもっときれいな方法がありますか?
クラスタイプでフィルタリングする述語を作成する方法はありますか?
現在、配列をループして、各オブジェクトのクラスを確認しています。たぶんもっときれいな方法がありますか?
述語でクラスを直接比較することもできます。
ただし、クラスクラスタに属するオブジェクトをフィルタリングしようとしている場合、またはサブクラスがある場合は、おそらく期待どおりに機能しません。
たとえば、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]);
次のように、「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 にはその方法がないため、カテゴリが必要です。