2013-08-23 14 views
5

string sollte einen String zurückgeben, warum diese AussageWarum kompiliert dieses NSAsert mit stringWithFormat nicht?

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

wenn

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

compiliert?

+0

StringWithFormat mit nur einem String wieder als Parameter in seinem Format ist redundant. Ich weiß es nicht genau, aber ich glaube, dass Apple eine Compiler-Level-Prüfung für solche Codes durchgeführt haben könnte. Welche Fehlermeldung erhalten Sie, wenn die Assert nicht kompiliert wird? – CodenameLambda1

+0

Extraneous schließende Klammer – hakonbogen

Antwort

15

verwenden wie:

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

Hoffe, dass es Ihnen hilft.

9

Sie müssen überhaupt nicht stringWithFormat verwenden. NSAsserterwartet bereits Sie eine Formatzeichenfolge und variable Argumente für die Formatierung übergeben. Gegeben Ihrem Beispiel, finden Sie diese genauso gut funktioniert:

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

Oder ein realistischeres Beispiel:

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

Der Grund für Ihr Problem ist, weil NSAssert is a macro, definiert wie folgt aus:

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

Und der Compiler ist verwirrt, weil es zwischen der Parameterliste für stringWithFormat und der des Makros Mehrdeutigkeit gibt. Wie Nishant hervorhebt, können Sie Klammern hinzufügen, um Verwirrung zu vermeiden, wenn Sie wirklich stringWithFormat hier verwenden möchten.

+0

Große Antwort! Es ist immer besser, das Framework zu nutzen. –

Verwandte Themen