用varargs写一个replaceTokensWithStrings:方法

时间:2012-07-19 10:59:54

标签: iphone objective-c ios cocoa-touch

我想做以下事情:

["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{

3 个答案:

答案 0 :(得分:1)

你不能将nil更改为@“”所以它将替换为空白字符串吗?

答案 1 :(得分: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

答案 2 :(得分:1)

NSLog在其格式字符串(第一个参数,文字字符串)中计算格式说明符(%@%i等)的数量,以便知道有多少参数它应该拉掉调用堆栈。这就是为什么它可以处理nil个参数 - 它使用计数来终止它的处理(顺便说一下,如果你给它的参数太少,为什么它会经常崩溃)。

由于你有一个格式类型的字符串,你可以做同样的事情 - 只需要一个辅助方法来计算被调用<something>的字符串中replaceTokensWithStrings:个元素的数量,并使用结果来限制您对va_list

的处理

对于您使用NS_SOMETHING_SPECIAL作为哨兵的情况,方法声明中的NS_REQUIRES_NIL_TERMINATIONnil。如果从某个地方获得参数计数,你不需要任何特殊的东西。