私はこれに困惑しています: iPhone Simulator 4.3 および 5.0 でアプリのフィルター機能をテストしましたが、すべてが機能しますが、iPhone では述語によって間違った結果が得られます。(正規表現と関係があると思われますが、エラーは表示されません。)
if (!selectionDidChange)
return;
[matches release];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"meta LIKE[c] %@",
UniversalKeyword];
NSPredicate *regional = [NSPredicate predicateWithFormat:@"regional == NIL OR regional == NO OR "
@"(regional == YES AND title.%K != NIL)", CurrentLanguage];
NSPredicate *exclusive = (exclusiveUpgrade ? [NSPredicate predicateWithValue:YES] :
[NSPredicate predicateWithFormat:@"exclusive == NIL OR exclusive == NO"]);
NSMutableArray *predicates = [[[NSMutableArray alloc] initWithCapacity:5] autorelease];
for (int i = 0; i < L(keywords); i++)
{
int selection = [D(A(keywords, i), @"selection") intValue];
if (selection >= 0)
A_ADD(predicates, ([NSPredicate predicateWithFormat:@"meta MATCHES[c] %@",
S(S(@".*\\b", D(A(D(A(keywords, i), @"values"), selection), @"name")), @"\\b.*")]));
}
NSPredicate *compound = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];
[predicates removeAllObjects];
[predicates addObject:predicate];
[predicates addObject:compound];
predicate = [NSCompoundPredicate andPredicateWithSubpredicates:A_NEW(regional, exclusive,
[NSCompoundPredicate orPredicateWithSubpredicates:predicates])];
matches = [[entries filteredArrayUsingPredicate:predicate] retain];
selectionDidChange = NO;
明確にするために:
entries
とkeywords
は辞書の配列ですkeywords
が、少し複雑です。重要なのは、 の各辞書には、 「A、B、C、D」のようなentries
名前の文字列が含まれていることです。meta
ユーザーが「C」を検索すると、正規表現が一致するはずです。コンパイルされた述語をチェックしたところ問題ないように見えたので、問題ではないように思われる他の基準があります。- 述語 (
meta LIKE[c] %@
) の最初の部分は、iPhone でも期待される結果を示しています。 - ここでは、便利なマクロをいくつか使用しています:
A_ADD = addObject:
、D = objectForKey:
、A = objectAtIndex:
、A_NEW = arrayWithObjects:
、L = count
およびS = stringByAppendingString:
。(ええ、私は怠け者です :D )
私はここで何を見落としていますか?