format string

chaps31chaps31 Membre
05:21 modifié dans API AppKit #1
Bonjour à  tous,

Un truc bizarre m'arrive, tout du moins bizarre pour moi.

Pourquoi :
predicate = [NSPredicate predicateWithFormat: <br />					 @&quot;%K BEGINSWITH %@&quot;,key,searchString];

fonctionne très bien, et :
predicate = [NSPredicate predicateWithFormat: <br />					 @&quot;%K %@ %@&quot;,key,comparateur,searchString];

me renvoi un [glow=yellow,2,300]Unable to parse the format string "%K %@ %@[/glow]
:)beta:

Réponses

  • AliGatorAliGator Membre, Modérateur
    janvier 2009 modifié #2
    Attention, les %@ dans les predicates n'ont pas tout à  fait le même comportement que dans les fonctions comme NSLog ou stringWithFormat ;) C'est toute la feinte.
    cf a syntaxe des NSPredicates ici.

    En particulier :
    When string variables are substituted into a format string using %@ , they are surrounded by quotation marks.
    En fait le "%@" dans les format strings des predicates est vraiment fait pour remplacer une variable, en particulier marquer le positionnement d'une chaà®ne (NSString)... mais qui est sensée être la chaà®ne à  rechercher, et sera donc entourée de guillemets, et non pas n'importe quelle chaà®ne (comme le comparateur pour toi). Ou alors si c'est un objet que tu passes pour le %@, (genre dictionnaire, ou tableau...) et pas une simple NSString, ça va l'encoder comme il faut pour donner un predicat valide... (cf l'exemple dans la doc Apple, même page, quand ils parlent des "aggregate operations" et de l'opérateur "IN".

    Ce %@ des "predicate format strings" n'est donc pas traité pareil que dans un stringWithFormat. Du coup le predicat résultat de ton predicateWithFormat (qui serait un truc genre [tt]macle "LIKE" "toto"[/tt], note les guillemets en trop autour du LIKE) n'a pas de sens.

    Conclusion, il faut que tu crées d'abord ta "predicate format string" avec un stringWithFormat, puis que tu la passes à  ton constructeur de NSPredicate ensuite :
    <br />NSString* predicateFormat = [NSString stringWithFormat:@&quot;%%K %@ %%@&quot; , comparateur]; // ==&gt; construit la chaine &quot;%K LIKE %@&quot; (si comparateur=¨@&quot;LIKE&quot;)<br /><br />// puis on construit le predicat avec ce predicateFormat (et predicateWithFormat va entourer la searchString avec des guillemets si nécessaire, etc.)<br />NSPredicate* predicate = [NSPredicate predicateWithFormat: predicateFormat ,key,searchString]; // du coup traitement spécial sur %@, pas le mm qu&#39;avec stringWithFormat<br />
    
Connectez-vous ou Inscrivez-vous pour répondre.