フィルタリングNSArray新NSArray、objective-c
-
02-07-2019 - |
質問
私は NSArray
ていただきたいと思いますように新しい NSArray
オブジェクトの配列の一定の要件を満たすことで、基準とします。の基準を決める機能を返します BOOL
.
を作成します NSMutableArray
,繰り返し処理を実行し、ソース配列にコピーし、オブジェクトのフィルター機能を受け入れを作成して不変の版です。
ありそうです。
解決
NSArray
や NSMutableArray
手段を提供しフィルター配列です。 NSArray
を提供 filteredArrayUsingPredicate: を返す新しい配列を含むオブジェクトの受信機に一致する、指定された述語. NSMutableArray
加 filterUsingPredicate: を評価する受取人被仕向行に伝達コンテンツに対して、指定された述語や葉のみオブジェクト。これらの方法以下の例です。
NSMutableArray *array =
[NSMutableArray arrayWithObjects:@"Bill", @"Ben", @"Chris", @"Melissa", nil];
NSPredicate *bPredicate =
[NSPredicate predicateWithFormat:@"SELF beginswith[c] 'b'"];
NSArray *beginWithB =
[array filteredArrayUsingPredicate:bPredicate];
// beginWithB contains { @"Bill", @"Ben" }.
NSPredicate *sPredicate =
[NSPredicate predicateWithFormat:@"SELF contains[c] 's'"];
[array filteredArrayUsingPredicate:sPredicate];
// array now contains { @"Chris", @"Melissa" }
他のヒント
あめんなさいものneatestを確実に使用 [NSPredicate predicateWithBlock:]
:
NSArray *filteredArray = [array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary *bindings) {
return [object shouldIKeepYou]; // Return YES for each object you want in filteredArray.
}]];
と思いつ簡潔にしています。
Swift:
すると NSArray
s迅速に、おみや もっと 簡潔なバージョン:
nsArray = nsArray.filter { $0.shouldIKeepYou() }
filter
はただの方法 Array
(NSArray
は暗黙的に架橋の早期の Array
).では一つの引数:を閉鎖する一つのオブジェクトの配列を返します Bool
.自閉鎖に戻っ true
他の物にしたいのフィルタ配列の型になります。
の場合はOS X10.6/iOS4.0以降では、あとブロックによNSPredicate.見 -[NSArray indexesOfObjectsPassingTest:]
たは書き込みご自身のカテゴリを追加するハンディ -select:
または -filter:
方法例).
たい誰かが書けるとこうにはどうすればよいのですか。チェック BlocksKit (配列docs).あり 多くの 次のようにすると、検索など "nsarrayブロックカテゴリー選択".
に基づく答えによる粘土、橋梁、以下に例を示しますフィルタリング用ブロックの変更 yourArray
ご配列変数名 testFunc
めの試験機能):
yourArray = [yourArray objectsAtIndexes:[yourArray indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
return [self testFunc:obj];
}]];
仮にこのオブジェはすべてのタイプとして追加できる方法カテゴリーの基底クラスを呼出し機能を使うためのご基準とします。それをNSPredicateオブジェクトに参加することで、方法。
一部のカテゴリ定義の方法を使用する機能
@implementation BaseClass (SomeCategory)
- (BOOL)myMethod {
return someComparisonFunction(self, whatever);
}
@end
そしてどこにきフィルタリング:
- (NSArray *)myFilteredObjects {
NSPredicate *pred = [NSPredicate predicateWithFormat:@"myMethod = TRUE"];
return [myArray filteredArrayUsingPredicate:pred];
}
もちろんいる場合、機能だけを比較対物件到達可能からのクラスであるだけで簡単に変換する機能の条件の述語文字列になります。
NSPredicate
はnextstepの構築条件でフィルターコレクション(NSArray
, NSSet
, NSDictionary
).
例えば考える二つの配列 arr
や filteredarr
:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",@"c"];
filteredarr = [NSMutableArray arrayWithArray:[arr filteredArrayUsingPredicate:predicate]];
のfilteredarrっての項目が含まれる文字cのです。
することを簡単に覚えの方は少なsqlでは
*--select * from tbl where column1 like '%a%'--*
1select*from tbl -->collection
2)column1のような'%a%' --> NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",@"c"];
3)select*from tblがcolumn1のような'%a%' -->
[NSMutableArray arrayWithArray:[arr filteredArrayUsingPredicate:predicate]];
ということで
NSArray+X h
@interface NSArray (X)
/**
* @return new NSArray with objects, that passing test block
*/
- (NSArray *)filteredArrayPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate;
@end
NSArray+X.m
@implementation NSArray (X)
- (NSArray *)filteredArrayPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
{
return [self objectsAtIndexes:[self indexesOfObjectsPassingTest:predicate]];
}
@end
貸出図書館
https://github.com/BadChoice/Collection
かくやすい配列の機能をなくループを再
できるだけい:
NSArray* youngHeroes = [self.heroes filter:^BOOL(Hero *object) {
return object.age.intValue < 20;
}];
または
NSArray* oldHeroes = [self.heroes reject:^BOOL(Hero *object) {
return object.age.intValue < 20;
}];
最で簡単に作成方法およびパス配列と値:
- (NSArray *) filter:(NSArray *)array where:(NSString *)key is:(id)value{
NSMutableArray *temArr=[[NSMutableArray alloc] init];
for(NSDictionary *dic in self)
if([dic[key] isEqual:value])
[temArr addObject:dic];
return temArr;
}