2010-06-19 13 views
0

Exemple: J'ai une méthode complexe qui fait beaucoup de choses, et à la fin je veux imprimer un rapport avec NSLog. NSLog veut une chaîne, puis un nombre arbitraire d'arguments. permet donc dire qu'il ya ces valeurs possibles qui peuvent être enregistrées:Comment construire dynamiquement les arguments pour NSLog?

A

B

C

D

E

F

Il peut arriver que -par exemple- C et D ne sont pas enregistrés, mais tout e repos. Comment pourrais-je construire une chose dynamique qui représente les arguments de valeur pour NSLog?

Je choisis NSLog pour cette question car il peut être plus simple d'utiliser NSPredicate et SUBQUERY. Il semble impossible de construire dynamiquement une chaîne de format NSPredicate en utilisant un NSMutableString et un appendFormat: ... il en résulte toujours des erreurs de compilation pour le prédicat. Je suppose que NSPredicate fait quelque chose de différent avec ses valeurs de format fournies que NSMutableString -appendFormat.

Donc, s'il y avait un moyen de nourrir NSPredicate avec:. 1) une énorme chaîne le format créé dynamiquement 2) un énorme, créé dynamiquement "liste" des arguments »

ce serait cool

+0

Selon votre autre question concernant prédicats, prédicats sophistiqués sont souvent mieux structurés et générés en utilisant des instances explicites des sous-prédicats comme des objets au lieu du format chaînes – ohhorob

Répondre

1

Votre problème sous-jacent ne devrait pas être un problème il suffit d'utiliser +predicateWithFormat:argumentArray: Quel problème vous avoir construit ça?

+0

Hey Rob, c'était exactement la bonne chose dont j'avais besoin. Parfait! – dontWatchMyProfile

+0

Heureux que cela a aidé. Si vous faites une construction complexe, vous pouvez également envisager de construire le prédicat réel à la main et de sauter la chaîne de format tout à fait. J'utilise cette technique lorsque je convertis des grammaires de recherche simples en prédicats. Si vos prédicats sont vraiment grands, cela peut aussi être plus rapide puisque vous ignorez l'analyse des chaînes. Voir "Création de prédicats directement dans le code" ici: http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/Predicates/Articles/pCreating.html –

2

Quelque chose comme ça devrait le faire, append conditionnellement parties à la chaîne:..

NSMutableString* logMsg = [NSMutableString stringWithFormat:@"%@ %@ %@", A, B, C]; 

if (C) [logMsg appendFormat:@" %@", C]; 
if (D) [logMsg appendFormat:@" %@", D]; 

[logMsg appendFormat:@" %@ %@", E, F]; 

NSLog(@"%@", logMsg); 
+0

** '[NSMutableString' **' stringWithFormat: '... – kennytm

+0

ouais, j'ai vu ça aussi, corrigé. – progrmr

1

Si vous collectez une liste variable de chaînes à sortir en même temps, utilisez simplement une NSMutableArray en ajoutant une ligne de sortie de journal si nécessaire. Puis à la fin du processus, joing les composants avec une chaîne:

NSMutableArray *logLines = [[NSMutable alloc] initWithCapacity:10]; 
... 
NSLog(@"Multiple-line output:\n%@",[logLines componentsJoinedByString:@"\n"]); 
[logLines release];