Obj-C中的NSNumber常量

DrW*_*urm 18 constants objective-c nsnumber ios

我想通过本主题中与NSStrings相同的样式制作一些NSNumber常量.也就是说,我正在创建单独的constants.h/.m文件并将它们导入需要访问它们的类中.

Chu*_*uck 18

这样做的麻烦在于没有编译时常量NSNumber这样的东西.只有NSString才能获得这种区别.NSNumbers始终是动态创建的.您可以使用在程序启动时运行的函数来伪造它以初始化变量.你的选择:

  1. 使用+load执行初始化的方法创建一个类.

  2. 在包含常量的文件中,包含一个函数__attribute__((constructor)).所以,例如:

    // Constants.m
    
    NSNumber *someGlobalNumber;
    
    __attribute__((constructor))
    static void InitGlobalNumber() {
        someGlobalNumber = [[NSNumber numberWithInteger:1] retain];
    }
    
    Run Code Online (Sandbox Code Playgroud)

但是,当然,您无法在启动过程早期运行的任何其他功能中可靠地使用这些数字.这通常不是问题,但值得记住.

另一个选项,我已经看过几次,是有一个类的数字访问器,而不是给变量的原始访问.这是一个更重的设计,但它也感觉不那么巫术,它有它的魅力.


DHa*_*ick 16

遗憾的是,您目前无法NSNumber以与生成常量相同的方式生成NSString常量.当您尝试这样做时,您将收到编译器错误

NSNumber * const kNumberConstant = @2; // This doesn't work.
Run Code Online (Sandbox Code Playgroud)

但是,您可以使用基元.

NSInteger const kSomeIntValue = 10;
Run Code Online (Sandbox Code Playgroud)

  • 这对每个人来说都有一点点;对于休闲应用程序,我会全力以赴地关注语法(点、下标等)。对于我团队的应用程序,我们有意识地决定避开点语法和数组/字典下标,但全部采用文字语法和 @property 声明。 (2认同)

Dav*_*d H 5

您基本上可以在三个部分中达到您想要的效果:

.h文件:

extern NSNumber *MyFirstConstant;
Run Code Online (Sandbox Code Playgroud)

.m文件

NSNumber *MyFirstConstant;
Run Code Online (Sandbox Code Playgroud)

AppDelegate.m

+(void)initialize
{
    MyFirstConstant = @5;
    ...
}
Run Code Online (Sandbox Code Playgroud)

AppDelegate保证在您的任何其他代码之前运行,并且初始化是在AppDelegate上调用的第一个方法,因此您可以基本上确保在应用程序运行之前为您设置所有常量.