2013-03-19 12 views
8

Dlaczego pierwszy z wymienionych fragmentów działa, a nie drugi?Dynamiczne tworzenie NSPredicate przez programowe ustawianie klucza

Snippet 1

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(coin_unique == %@)", [NSNumber numberWithInt:species]]; 

Snippet 2

// Does NOT Work 
NSString *predicateText = @"coin_unique"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%@ == %@)", predicateText, [NSNumber numberWithInt:species]]; 

mam do dynamicznego tworzenia predykatu w zależności od argumentu otrzymała w moim sposobem.

Odpowiedz

18

coin_unique jest kluczem, więc potrzebuje specyfikator formatu %K:

NSString *predicateText = @"coin_unique"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%K == %@)", predicateText, [NSNumber numberWithInt:species]]; 

Składnia format jest opisany dość dobrze here.

0

Wystąpił następujący błąd, mimo że mój NSPredicate został poprawnie sformatowany.

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Insufficient arguments for conversion characters specified in format string.' site:stackoverflow.com 

Jak głupiec zapomniałem zdać drugi argument do formatu kwantyfikatorów (bo były dwie %@). To znaczy. NSPredicate(format:predicateFormat,argumentArray:[Date()]) ma tylko jeden element w tablicy, gdy musi być dwa: [Date(), Date()]

Powiązane problemy