Objective C中的#define是做什么的?

时间:2016-06-07 16:09:50

标签: objective-c c-preprocessor

我发现可以在Objective C中使用#define来缩小更长的功能,但我不确定它在这里做了什么:

#define S(s) @#s

稍后在代码中,开发人员将其用于:

self.scopeDisplayNames = @[S(SPTAuthUserReadPrivateScope), S(SPTAuthUserReadEmailScope)];

我对它的作用感到非常困惑。另外,有没有办法在Swift中执行此操作?

谢谢!

2 个答案:

答案 0 :(得分:3)

它声明了一个宏函数,可以将参数转换为NSString字面值。例如,S(hi)会扩展为@"hi"

供参考:

要回答你的第二个问题,我所知道的Swift无法做到这一点。无论如何,这两种语言都不是一个好主意。

答案 1 :(得分:1)

@Adrian的答案是正确的,但我认为这一点很缺点,评论也是如此。

查看代码示例:

self.scopeDisplayNames = @[S(SPTAuthUserReadPrivateScope), S(SPTAuthUserReadEmailScope)];

SPTAuthUserReadPrivateScope是Spotify SDK中NSString *类型的全局常量。宏调用:

S(SPTAuthUserReadPrivateScope)

扩展为:

@"SPTAuthUserReadPrivateScope"

这是变量名称作为字符串。

为什么不直接把它写成字符串?

因为如果你这样做,你可能会产生一个简单的拼写错误,编译器无法捕获它。通过使用宏,Xcode的自动完成支持参数 - 只需输入名称。

因此,当需要将变量的名称作为字符串时,宏是一种避免意外拼写错误的方法。

以下是Xcode中的自动完成功能:

auto-completion in Xcode

自动弹出自动完成框。如果你开始输入一个字符串常量,例如@"SPT,然后自动完成不会自动激活,但您可以通过点击转义键来调用它。

HTH