如何在接口中管理大量标志变量

时间:2011-03-31 12:49:41

标签: objective-c

有时我的界面最终会有很多的标志变量,例如isThatFeatureEnabled。或者,更糟糕的是,我将有一个包含标志和实例信息的界面。

在读取一些UIKit头文件时,我发现有些类声明了一个struct,其中包含了所需的所有内部标志。例如UIView有:

struct {
    unsigned int userInteractionDisabled:1;
    unsigned int implementsDrawRect:1;
    unsigned int implementsDidScroll:1;
    unsigned int implementsMouseTracking:1;
    unsigned int hasBackgroundColor:1;
    unsigned int isOpaque:1;

    // ...

} _viewFlags;

这是如何工作的以及如何使用?

另外,(抱歉,如果这看起来似乎无关),请以StoreKit的SKProduct为例。它没有任何方法,只有readonly属性可用于获取特定于实例的信息,例如localizedDescriptionlocalizedTitleprice。但它是如何初始化的?初始化此类实例的代码如果是readonly,它们如何首先设置这些属性?我看到这个班级也有一个id _internal ivar;这是为了什么?

我常常使用类似于SKProduct的接口,但我的属性不能是readonly,因为我不知道如何在需要初始化实例时设置它们,例如在XML解析代码中。

1 个答案:

答案 0 :(得分:1)

您提供的结构是C,C ++和Objective C用于声明位域的方式。它比#define MYFLAG 0x0001更有优势,因为您可以进行编译器检查,因此您不会执行以下任何操作:

  • 意外地将同一位分配给多个标志
  • 意外覆盖带有数字的旗帜(例如flag=34
  • 使用错误的变量(例如#define)意外使用一个myColor=FLAG_TEMPERATURE_HIGH

您可以在C ++中进行结构分配的同时设置所有变量。我上次看的时候你不能用C或Objective-C做到这一点,但你现在可以这样做。

您可以像设置任何其他实例变量一样设置和获取这些标志。