2013-08-23 10 views
5

stringWithFormat dovrebbe restituire una stringa, perché questa affermazione non compilarePerché non questo NSAssert con stringWithFormat è compilato?

NSAssert(YES, [NSString stringWithFormat:@"%@",@"test if compiles"]); 

quando

NSAssert(YES, @"test if compiles"); 

compila?

+0

stringWithFormat con solo una stringa nuovamente come un parametro nel suo formato è ridondante. Non so esattamente, ma credo che Apple avrebbe potuto fare qualche controllo del livello del compilatore su tali codici. Quale errore/messaggio si ottiene quando l'asserzione non viene compilata? – CodenameLambda1

+0

Dispositivo di chiusura estraibile – hakonbogen

risposta

15

utilizzare questo come:

NSAssert(YES, ([NSString stringWithFormat:@"%@",@"test if compiles"])); // Pass it in brackets() 

Spero che ti aiuta.

9

In realtà non è necessario utilizzare stringWithFormat. NSAssertsi aspetta già per passare una stringa di formato e argomenti variabili per la formattazione. Dato il tuo esempio, troverete questo funziona altrettanto bene:

NSAssert(YES, "%@", @"test if compiles"); 

Oppure, un esempio più realistico:

NSAssert(i > 0, @"i was negative: %d", i); 

Il motivo per il vostro problema è dovuto al fatto NSAssert is a macro, definita in questo modo:

#define NSAssert(condition, desc, ...) 

E il compilatore è confuso perché c'è un'ambiguità tra l'elenco dei parametri per stringWithFormat e quello della macro stessa. Come fa notare Nishant, puoi aggiungere parentesi per evitare la confusione se vuoi davvero usare stringWithFormat qui.

+0

Ottima risposta! È sempre meglio sfruttare il framework. –

Problemi correlati