You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:09:24