5

ViewDidLoadメソッドに次の要素を持つ配列があります

inputArray = [NSMutableArray arrayWithObjects:@"car", @"bus", @"helicopter", @"cruiz", @"bike", @"jeep", nil];

UITextField要素を検索するための別のものがあります。そのため、入力UITextFieldしたら、その文字列が「inputArray」に存在するかどうかを確認したいと思います。inputArray の要素と一致しない場合は、inputArray から対応する要素を削除します。

 for (NSString* item in inputArray)
   {
        if ([item rangeOfString:s].location == NSNotFound) 
        {
            [inputArray removeObjectIdenticalTo:item];//--> Shows Exception
            NSLog(@"Contains :%@",containsAnother);
        }

  }

しかし、このコードは、「removeobject:」に関連する例外を示しています。

例外 :

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSCFConstantString rangeOfString:options:range:locale:]: nil argument'
*** First throw call stack:
`
4

8 に答える 8

0

あなたが使用できることを指摘するためのAnoopへの+1 filteredArrayUsingPredicate。したがって、 の一致に基づいて新しい配列を作成する場合は、次のinputArrayようなものも使用できます。

NSArray *matchingArray = [inputArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF contains[c] %@", s]];

または、次の 1 行で配列を単純inputArrayNSMutableArrayフィルタリングできます。

[inputArray filterUsingPredicate:[NSPredicate predicateWithFormat:@"SELF contains[c] %@", s]];

または、ブロックが好きなら:

[inputArray filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return ([evaluatedObject rangeOfString:s].location != NSNotFound);
}]];
于 2013-04-15T14:53:57.317 に答える
0

これは私が使いたいクリーンなソリューションです。NSArray カテゴリを定義して拡張し、mapメソッドを作成します。このメソッドは、ブロック内で返されたものに基づいて新しい NSArray を作成します。

@interface NSArray (BlockExtensions)
/*! 
 Invokes block once for each element of self, returning a new array containing the
 values returned by the block.
 */
- (NSArray *)map:(id (^)(id obj))block;

@end

@implementation NSArray (BlockExtensions)

- (NSArray *)map:(id (^)(id obj))block
{
    return [self mapWithOptions:0 usingBlock:^id(id obj, NSUInteger idx) {
        return block(obj);
    }];
} 

- (NSArray *)mapWithOptions:(NSEnumerationOptions)options usingBlock:(id (^)(id obj, NSUInteger idx))block
{
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:[self count]];
    [self enumerateObjectsWithOptions:options usingBlock:^(id obj, NSUInteger idx, BOOL *stop)     {

        id newobj = block? block(obj, idx) : obj;
        if (newobj)
            [array addObject:newobj];
    }];
    return array;
}
    @end

このブロックは、元の配列内のすべての項目に対して 1 回呼び出され、このオブジェクトをパラメーターとして渡します。

NSArray *newArray = [inputArray map:^id(NSString *item) {
    if ([item rangeOfString:s].location == NSNotFound) {
        return item;
    }
    return nil;
}];

newArray除外されたアイテムが含まれます!

于 2013-04-15T13:16:22.277 に答える