2013-08-23 8 views
5

stringWithFormatは、なぜこの文はstringWithFormatでこのNSAssertをコンパイルできないのはなぜですか?

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

とき

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

コンパイルをコンパイルしていない文字列を返す必要がありますか?

+0

stringWithFormatは、文字列をその形式のパラメータとして再度使用することは冗長です。私は正確には分かりませんが、アップルはこのようなコードのコンパイルレベルチェックを行っている可能性があります。アサーションがコンパイルされなかった場合、どのようなエラー/メッセージが表示されますか? – CodenameLambda1

+0

異質の閉じ括弧 – hakonbogen

答えて

15

としてこれを使用します。

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

は、それはあなたのお役に立てば幸いです。

9

実際にstringWithFormatを使用する必要はありません。 NSAssertは、フォーマット文字列と可変引数をフォーマットするために既にを渡すことを期待しています。

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

あるいは、より現実的な例:

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

次のように定義され、NSAssert is a macroので、あなたの問題の原因はあなたの例を考えると、あなたは、これはちょうど同様に動作見つけることができます

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

のパラメータリストとマクロ自体のパラメータリストのあいまいさがあるため、コンパイラは混乱します。 Nishantが指摘しているように、本当にここでstringWithFormatを使用したい場合は、混乱を避けるために角括弧を追加することができます。

+0

すばらしい答え!フレームワークを活用する方が常に良いです。 –

関連する問題