1

私は次のことをしたい:

["Hello <firstname> <middlename> <lastname>". replaceTokensWithStrings: 
  @"firstname", someFirstName, 
  @"middlename", middleNameMightBeNilObject,
  @"lastname", lastNameObject];

nil「ターミネータの問題」のため、これは不可能のようです。

ただしNSLog、複数の引数を取りnil、パラメータとしても処理できます。

NSString *nilValue = nil;

NSLog(@"Value of nilValue=%@", nilValue);

出力

Value of nilValue=(null)

では、どうすれば私のreplaceTokensWithStrings:...方法でこれを達成できますか?

更新:私のメソッドのシグネチャ:

-(NSString *)replaceTokensWithStrings:(NSString *)input, ... NS_SOMETHING_SPECIAL_HERE{
4

3 に答える 3

1

nilを@""に変更して、空白の文字列に置き換えることはできませんか?

于 2012-07-19T11:00:56.230 に答える
1

NSLog呼び出しスタックからプルする引数の数を知るために、フォーマット文字列(最初の引数、リテラル文字列)内のフォーマット指定子(%@、など)の数をカウントします。%iこれがnil引数を処理できる理由です-カウントを使用して処理を終了しています(そして、ちなみに、引数が少なすぎるとクラッシュすることがよくあります)。

formatタイプの文字列があるので、同じことを行うことができます。呼び出さ<something>れた文字列内の要素の数をカウントするヘルパーメソッドをreplaceTokensWithStrings:作成し、その結果を使用しての処理を制限するだけva_listです。

NS_SOMETHING_SPECIALメソッド宣言のinは、番兵としてNS_REQUIRES_NIL_TERMINATION使用している場合に使用されます。nilどこかから引数の数を取得している場合は、特別なことは何も必要ありません。

于 2012-07-19T19:20:51.290 に答える
1

動かない?

["Hello <firstname> <middlename> <lastname>". replaceTokensWithStrings: 
  @"firstname", @"Peter", 
  @"middlename", @"", // or myStr
  @"lastname", @"Smith"];

または値を確認してください:

@"middlename", myStr ? myStr : @"",

編集:

可変パラメーターが必要な場合は、http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.htmlを参照してください。

于 2012-07-19T11:07:36.023 に答える