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

不工作?

["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 回答
1

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

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

NS_SOMETHING_SPECIAL您的方法声明中将NS_REQUIRES_NIL_TERMINATION适用于您nil用作哨兵的情况。如果您从某个地方获取参数的数量,则不需要任何特别的东西。

于 2012-07-19T19:20:51.290 回答