代码之家  ›  专栏  ›  技术社区  ›  Ken

Objective-C头文件中的常量是如何初始化的?

  •  7
  • Ken  · 技术社区  · 14 年前

    如何初始化头文件中的常量?

    例如:

    @interface MyClass : NSObject {
    
      const int foo;
    
    }
    
    @implementation MyClass
    
    -(id)init:{?????;}
    
    3 回复  |  直到 11 年前
        1
  •  16
  •   unbeli    14 年前

    对于“public”常量,您将其声明为 extern 在头文件(.h)中,并在实现文件(.m)中对其进行初始化。

    // File.h
    extern int const foo;
    

    然后

    // File.m
    int const foo = 42;
    

    考虑使用 enum 如果它不只是一个,而是多个常量在一起

        2
  •  12
  •   JeremyP    14 年前

    目标C类不支持常量作为成员。你不能按你想要的方式创建常量。

    声明与类关联的常量的最接近方法是定义一个返回它的类方法。也可以使用extern直接访问常量。这两种情况都显示如下:

    // header
    extern const int MY_CONSTANT;
    
    @interface Foo
    {
    }
    
    +(int) fooConstant;
    
    @end
    
    // implementation
    
    const int MY_CONSTANT = 23;
    
    static const int FOO_CONST = 34;
    
    @implementation Foo
    
    +(int) fooConstant
    {
        return FOO_CONST; // You could also return 34 directly with no static constant
    }
    
    @end
    

    类方法版本的一个优点是它可以很容易地扩展为提供常量对象。可以使用外部对象,nut必须在初始化方法中初始化它们(除非它们是字符串)。因此,您经常会看到以下模式:

    // header
    @interface Foo
    {
    }
    
    +(Foo*) fooConstant;
    
    @end
    
    // implementation
    
    @implementation Foo
    
    +(Foo*) fooConstant
    {
        static Foo* theConstant = nil;
        if (theConstant == nil)
        {
            theConstant = [[Foo alloc] initWithStuff];
        }
        return theConstant;
    }
    
    @end
    
        3
  •  0
  •   Gerry Shaw    11 年前

    对于像整数这样的值类型常量,一个简单的方法是使用 enum hack 正如Unbeli所暗示的。

    // File.h
    enum {
        SKFoo = 1,
        SKBar = 42,
    };
    

    这比使用 extern 它都是在编译时解决的,所以不需要内存来保存变量。

    另一种方法是 static const 这就是在C/C++中取代EnUM黑客的方法。

    // File.h
    static const int SKFoo = 1;
    static const int SKBar = 42;
    

    通过对苹果头文件的快速扫描,可以发现枚举黑客方法似乎是在Objective-C中实现这一点的首选方法,实际上我发现它更干净,可以自己使用。

    此外,如果要创建选项组,则应考虑使用 NS_ENUM 创建类型安全常量。

    // File.h
    typedef NS_ENUM(NSInteger, SKContants) {
        SKFoo = 1,
        SKBar = 42,
    };
    

    更多信息 恩斯纳姆 它的表妹 NS_OPTIONS 可在 NSHipster .