2012-04-15 3 views
0

私はNSMutable配列にバンドルしているpListの文字列を持っています。目的のC NSPredicateクラスでcharacterAtindexを使用

NSString *path = [[NSBundle mainBundle] pathForResource:@"small" ofType:@"plist"]; 
_availableWords = [[NSMutableArray alloc]initWithContentsOfFile:path]; 

文字列内の各文字を指定した文字と比較し、結果を使用して新しい配列を作成したいと考えています。

私は

以下
NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF beginswith[cd] %@", @"B"]; 

NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF endswith[cd] %@", @"B"]; 

を使用して、最初と最後の文字にフィルタリングすることができるよしかし、私はエラーを取得するcharacterAtIndexメソッドを使用しての間で文字をチェックしようとします。

NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF characterAtIndex:%i LIKE[cd] %@", 3, @"B"]; 

は、私はおそらく文字をチェックし、各単語をループするループを行うことができます知っているが、使用してNSPredicateはあまり整然とです(10万上)文字列のリストが非常に大きくなる可能性が考慮はるかに優れた性能でなければなりません。

NSPredicateでcharacterAtIndexを使用するための適切な構文を誰かに教えてもらえますか、他のソリューションのアイデアはありますか?

更新:以下のKensの回答に基づいて、私は今、次のコードを使用して最初と最後の文字以外の文字をチェックしています。たとえば、次の例では4番目の文字がチェックされます。私は、デバッガで一致配列を検査するために行くとき

NSArray *matches = [_availableWords objectsAtIndexes:[_availableWords indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
    return (BOOL)([obj characterAtIndex:3] == 'R'); 
}]]; 

はしかし、私は、配列内の以下のエラー

matches NSArray * 0x06a67ba0 @"Variable is not a CFArray" 

なしのオブジェクトを参照してください。 short.pListのサンプルデータに基づいて、配列内に1つのオブジェクトが表示されます。任意の助けを事前に

おかげで、 ダーム

答えて

4

述語に建てられたが、このような操作をサポートしていません。しかし、あなたはブロックを評価する述語を構築することができます。

NSPredicate* filter = [NSPredicate predicateWithBlock:^(id evaluatedObject, NSDictionary *bindings){ 
    return (BOOL)([evaluatedObject characterAtIndex:3] == 'B'); 
}]; 

それとも、あなただけ振り向くと、この述語を持つ配列をフィルタリングするつもりなら、あなたは仲介をカットし、識別するためにブロックを使用することができます配列の要素を直接入力してください:

NSArray* matches = [array objectsAtIndexes:[array indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
    return (BOOL)([obj characterAtIndex:3] == 'B'); 
}]]; 
+0

ありがとうKen、Yaこの述語で配列をフィルタリングしたいだけです。上記の2番目のコードブロックを試してみると、 'BOOL(^)(__ strong id、NSUInteger、BOOL)型のパラメータにint(^)(__ strong id、NSUInteger、BOOL * *) '。何か案は? – dermd

+0

戻り値の型をBOOLに強制するための例を調整しました。 –

+0

Kenに感謝、これですべての助けに感謝します。これはまさに私が探していたものと思われます。これが愚かな質問である場合はお詫び申し上げます。私はObjective Cの初心者ですが、変数 "はCFArrayではありません"というエラーが表示されます。私がpListを取り出してバンドルした後、値をNSMutableArrayに入れて、それをフィルタリングしようとしているNSMutableArrayです。 – dermd

関連する問題