NSLocalizedString - 使用未声明的标识符问题

Dav*_*tti 7 cocoa-touch objective-c nslocalizedstring

我正在使用NSLocalizedString一个特定的消息,如果第二个参数作为一个变量传递,它可以正常工作,但如果第二个参数的写入与设置的变量完全相同Use of undeclared identifier 'NSLocalizedString',Too many arguments provided to function-like macro invocation则会失败.我有使用变量的工作代码,这很好,我只是想了解在其他情况下无法知道如何避免它的原因.

使用以下声明:

NSString *branchTitle = [branchDictionary objectForKey:@"Title"];
NSString *localString = [NSMutableString stringWithFormat:@"%@ node title", branchTitle];
Run Code Online (Sandbox Code Playgroud)

这没关系,工作正常:

[navItem setTitle:NSLocalizedString(branchTitle, localString)];
Run Code Online (Sandbox Code Playgroud)

...但是,这似乎与我相同,但由于上述错误而失败:

[navItem setTitle:NSLocalizedString(branchTitle, [NSMutableString stringWithFormat:@"%@ node title", branchTitle])];
Run Code Online (Sandbox Code Playgroud)

在这里和其他地方搜索我没有找到解释.我阅读了每个错误消息和各种NSLocalizedString问题的一些点击,但没有任何将它们联系在一起的内容.我发现的第二条错误消息暗示可能是clang的问题和语句中的逗号数量,表明即使额外的逗号在NSMutableString消息中,它仍被视为额外的参数NSLocalizedString.这有任何意义吗?

这个问题并不重要,但该声明旨在根据从字典中提取的英文版本设置导航栏标题的本地化版本,该字典因不同视图而异.该NSMutableString部分根据英文标题定义了本地化的注释.

编辑:根据下面接受的答案解决此问题后,我注意到另一个相关问题.该声明localString正在产生"Unused variable"编译器警告,但显然正在使用它.这也是因为它在C-macro中并且为了完整性,我在这里添加一个关于抑制该警告的相关帖子的链接:如何在Xcode中摆脱"未使用的变量"警告

ser*_*gio 14

我相信这是C-macro扩张不良的结果.的确,如果你写:

NSLocalizedString(branchTitle, ([NSString stringWithFormat:@"%@ node title", branchTitle]));
Run Code Online (Sandbox Code Playgroud)

这将编译.由于某种原因,预处理器没有很好地处理其中的文本[](可能因为它不知道Objective-C调用)并将所有元素[]视为单独的参数:

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

PS:当我写坏C-宏展开,我的意思是这样:

宏扩展是一个棘手的操作,充满了令人讨厌的极端情况和情况,这些情况使得您认为这是一种非常好的方式来以非常微妙的方式优化预处理器的扩展算法.

  • 很好,只需添加一组括号即可修复它.NSLocalizedString是我在Objective-C中有意使用的第一个C-macro,所以当其他人转过来时,这是一个很好的提示.谢谢! (2认同)