2013-08-23 50 views
5

stringWithFormat應該返回一個字符串,爲什麼這種說法不能編譯爲什麼不用stringWithFormat編譯NSAssert?

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

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

編譯?

+0

stringWithFormat只是一個字符串再次作爲參數的格式是多餘的。我不完全清楚,但我相信,蘋果可能會對發生的任何此類代碼進行一些編譯器級別的檢查。當assert不能編譯時會得到什麼錯誤/消息? – CodenameLambda1

+0

Extraneous closing brace – hakonbogen

回答

15

以此爲:

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

希望它可以幫助你。

9

根本不需要使用stringWithFormatNSAssert已經預計您傳遞格式字符串和可變參數進行格式化。鑑於你的榜樣,你會發現這個效果一樣好:

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

或者,更現實的例子:

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

原因你的問題是因爲NSAssert is a macro,這樣的定義:

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

由於stringWithFormat的參數列表與宏本身的參數列表之間存在不明確之處,編譯器會感到困惑。正如Nishant指出的那樣,如果您真的想在這裏使用stringWithFormat,您可以添加括號以避免混淆。

+0

很好的回答!利用框架總是更好。 –