Objective-C多语言NSString适配语法及Java迁移实现问题
实现Objective-C中类似Java风格的字符串翻译调用
要实现你想要的SS("string_to_translate")这种无需@符号的调用方式,只需要调整你的预处理宏定义即可,核心是让传入的双引号包裹的字符串字面量直接转换为Objective-C的NSString字面量。
解决方案代码
修改你的SS宏定义,替换成以下内容:
#define String NSString* #define SS(str) S(@str)
调用示例
现在你可以完全按照Java风格来调用:
String translated = SS("string_to_translate");
这段代码会被预处理器展开为:
NSString* translated = S(@"string_to_translate");
完全符合你的需求,不需要额外添加@符号,只用双引号包裹字符串即可。
原宏问题分析
你原来的#define SS(stringa) S(@#stringa)宏,使用了@#的预处理器语法——它的作用是将宏参数直接字符串化并加上Objective-C的字符串前缀。比如当你调用SS("string_to_translate")时,会被展开为:
S(@"\"string_to_translate\"")
这会导致传入S方法的是一个包含双引号转义字符的字符串(即"\"string_to_translate\""),显然不是你想要的结果。而新的宏直接用@str,会把传入的双引号字符串字面量"string_to_translate"转换为Objective-C的NSString字面量@"string_to_translate",完美匹配你的需求。
注意事项
- 这个宏仅适用于字符串字面量(即用双引号直接包裹的字符串)。
- 如果传入的是
NSString类型的变量,比如NSString* myStr = @"test"; String translated = SS(myStr);,会被展开为S(@"myStr")而非S(myStr),不符合预期,但这正是模拟Java风格的字符串字面量调用的设计目标,所以这个限制是可接受的。
内容的提问来源于stack exchange,提问作者christian mini
相关产品推荐
相关产品推荐

