7

私はNSLocalizedString特定のメッセージで使用しています。これは、2番目のパラメーターが変数として渡された場合は正常に機能しますが、失敗しUse of undeclared identifier 'NSLocalizedString'Too many arguments provided to function-like macro invocation2番目のパラメーターが変数が設定されたのとまったく同じように書き込まれた場合に機能します。私は変数を使用してコードを動作させていますが、これは問題ありません。他の状況でそれを回避する方法がわからない理由を理解したいだけです。

次の宣言で:

NSString *branchTitle = [branchDictionary objectForKey:@"Title"];
NSString *localString = [NSMutableString stringWithFormat:@"%@ node title", branchTitle];

これはエラーなしで正常に機能します。

[navItem setTitle:NSLocalizedString(branchTitle, localString)];

...しかし、これは私と同じように見えますが、上記のエラーで失敗します。

[navItem setTitle:NSLocalizedString(branchTitle, [NSMutableString stringWithFormat:@"%@ node title", branchTitle])];

ここや他の場所を検索しても、説明が見つかりません。各エラーメッセージとさまざまな問題に関する多数のヒットを読みましたNSLocalizedStringが、それらを結び付けるものは何もありませんでした。2番目のエラーメッセージについて私が見つけたのは、clangとステートメント内のコンマの数に問題があることを意味し、NSMutableStringメッセージ内に余分なコンマが含まれていても、によって追加のパラメーターとして表示されていたことを示していますNSLocalizedString。それは意味がありますか?

質問にとって重要ではありませんが、このステートメントは、辞書から取得した英語バージョンに基づいてナビゲーションバータイトルのローカライズバージョンを設定することを目的としています。これは、ビューごとに異なります。このNSMutableString部分は、英語のタイトルに基づいてローカリゼーションのコメントを定義します。

編集:以下の受け入れられた答えに従ってこの問題を解決した後、私は別の関連する問題に気づきました。の宣言は、明らかに使用されていましたがlocalString、コンパイラの警告を生成していました。"Unused variable"これは、Cマクロ内にあるためでもあり、完全を期すために、警告の抑制に関する関連する投稿へのリンクをここに追加しています。Xcodeで「未使用の変数」警告を取り除くにはどうすればよいですか。

4

1 に答える 1

14

これは悪いCマクロ拡張の結果だと思います。確かに、あなたが書く場合:

NSLocalizedString(branchTitle, ([NSString stringWithFormat:@"%@ node title", branchTitle]));

これはコンパイルされます。何らかの理由で、プリプロセッサは内部のテキストを適切に処理[]しておらず(おそらく、Objective-C呼び出しについて認識していないため)、内部のすべての要素[]を個別の引数として扱います。

#define NSLocalizedString(key, comment) \
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

PS:私が悪いCマクロ拡張を書いたとき、私はこれを意味しました

マクロ展開はトリッキーな操作であり、厄介なコーナーケースや、プリプロセッサの展開アルゴリズムを非常に微妙な方法で間違って最適化するための気の利いた方法であると思われる状況を引き起こします。

于 2013-01-17T17:36:16.977 に答える