2

オブジェクトがいくつかのクラスの1つを持っているかどうかを確認するためのより良い方法はありますか

if ([item isKindOfClass:[NSArray class]] || [item isKindOfClass:[NSNumber class]] || 
[item isKindOfClass:[NSPredicate class]] || [item isKindOfClass:[NSMutableArray class]] 
|| [item isKindOfClass:[NSString class]]) {
   return YES;
};

これよりも優雅な方法はありますか?できれば、ループ/配列のカテゴリやマルチラインを作成する必要のないインラインの方法です。

4

2 に答える 2

4

おそらくこれ?

NSArray *classes = @[ [NSArray class], [NSNumber class], [NSPredicate class], (etc.)];
for (Class cls in classes) {
    if ([item isKindOfClass:cls]) {
        return YES;
    }
}

それほど簡潔ではありませんが、読みやすく、保守しやすいと思います。

編集:当然、私がこれを書いているときに、ループや配列がないことについての規定を追加します。:)

NSPredicateと"@any.FUNCTION(isKindOfClass :)"キーパスを使用してそれを行うことができるかもしれませんが、これ以上優雅になるとは思いません。ほとんどの人は読みにくいと思うでしょう。私は本当に配列とforループがここに行く方法だと思います。

于 2013-03-25T06:17:24.570 に答える
0

これが私がやったことです:

NSArray *classes = @[ [NSArray class], [NSDictionary class], [NSSet class] ];
NSUInteger *matches = [classes indexesOfObjectsPassingTest:^BOOL(id class, NSUInteger idx, BOOL *stop) {
           return [item isKindOfClass:class]);
       }].count;
于 2013-03-25T06:45:37.160 に答える