[英]What is the best way to define string constants in an objective-c protocol?
[英]What is the best way to create constants in Objective-C
我正在创建一个用于学习目的的Reddit客户端。 我需要一个包含常量的文件。 我正在考虑在Reddit-Prefix.pch
文件中导入文件,以使常量可用于所有文件。 这是一种很好的做事方式吗? 另外,我已经完成了我的研究并发现了几种创建常量的方法,但我不知道使用哪种方法:
#define
宏 const
static const
extern const
enum
那么首选方式是哪种方式? 惯例是什么? 我知道“这取决于”,但更具体地说,我的问题是: 每个解决方案的用例是什么?
另外,如果使用extern const
,我是否需要导入文件,否则常量将全局可用而不导入文件?
我可以在逻辑上得出结论的一点是,在定义类似自定义错误域的东西时, enum
是最佳选择(我实际上是对吗?)。 但其他人呢?
第一个问题是你希望你的常数有多大的范围,这实际上是两个问题:
如果它们是特定的并且是单个类的内部属性,则在.m文件的顶部将它们声明为static const
,如下所示:
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
如果它们属于单个类但应该是公共的/由其他类使用,则在标题中将它们声明为extern
并在.m中定义它们:
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
如果它们应该是全局的,则在标题中声明它们并在相应的模块中定义它们,特别是对于那些常量。
你可以为不同的常量混合和匹配这些常量,它们具有不同级别的全局性,以及不同的全局常量 - 你可以将它们放在单独的模块中,每个模块都有自己的标题,如果你想。
#define
? 旧的答案是“宏没有类型信息”,但今天的编译器非常聪明地对文字进行所有类型检查(宏扩展到什么)以及变量。
现代的答案是因为调试器不会知道您的宏。 如果MyThingNotificationKey
是一个宏,你不能在调试器命令中说[myThing addObserver:self forKey:MyThingNotificationKey]
; 如果它是一个变量,调试器只能知道它。
enum
? 好吧,rmaddy在评论中打败了我: enum
只能定义整数常量。 串行标识符号,位掩码,四字节代码等等。
出于这些目的, enum
很棒,你绝对应该使用它。 (更好的是,使用NS_ENUM
和NS_OPTIONS
宏 。)对于其他事情,你必须使用其他东西; enum
除了整数之外什么都不做。
我正在考虑在Reddit-Prefix.pch文件中导入文件,以使常量可用于所有文件。 这是一种很好的做事方式吗?
可能无害,但可能过度。 在需要的地方导入常量标题。
每种解决方案的用例有哪些?
#define
:相当有限。 老实说,我不确定是否有充分的理由将其用于常数。 const
:最适合本地常量。 此外,您必须将此用于您在标头中声明的并且现在正在定义的那个。 static const
:最适合特定于文件(或特定于类)的常量。 extern const
:在标头中导出常量时必须使用它。 另外,如果使用
extern const
,我是否需要导入文件,否则常量将全局可用而不导入文件?
您需要在您使用它的每个文件或前缀标头中导入该文件。
考虑使用FOUNDATION_EXPORT
比extern
更具兼容性,因为它在基础中定义并编译为C,C ++和Win32的兼容格式。
如NSObjCRuntime.h中所定义
#if defined(__cplusplus)
#define FOUNDATION_EXTERN extern "C"
#else
#define FOUNDATION_EXTERN extern
#endif
#if TARGET_OS_WIN32
#if defined(NSBUILDINGFOUNDATION)
#define FOUNDATION_EXPORT FOUNDATION_EXTERN __declspec(dllexport)
#else
#define FOUNDATION_EXPORT FOUNDATION_EXTERN __declspec(dllimport)
#endif
#define FOUNDATION_IMPORT FOUNDATION_EXTERN __declspec(dllimport)
#else
#define FOUNDATION_EXPORT FOUNDATION_EXTERN
#define FOUNDATION_IMPORT FOUNDATION_EXTERN
#endif
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.