我想做以下事情:
["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{
答案 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_TERMINATION
为nil
。如果从某个地方获得参数计数,你不需要任何特殊的东西。