有没有办法为NSObject设置变量而不为每个创建属性?

时间:2011-12-04 15:53:30

标签: iphone objective-c ios

基本上,我有一个带有很多布尔变量的自定义NSObject。我想知道是否有办法修改这些变量(来自这个类之外)而不为每个变量创建一个属性。这可能吗?提前致谢! 这是我对象标题的一部分:

@interface Polygons : NSObject {

//BOOL values for attributes
BOOL parallelogram;
BOOL rhombus;
BOOL square;

...

}

4 个答案:

答案 0 :(得分:4)

使用位掩码表示一组相关的布尔属性。首先,像这样定义一个枚举:

enum GeometryFlags {
    Parallelogram = 1 << 0,
    Rhombus       = 1 << 1,
    Square        = 1 << 2,

    // etc.
};

您可以选择提供相应的typedef语句:

typedef NSUInteger GeometryFlags;

然后,您可以定义一个属性以允许外部调用者访问位掩码:

// In .h file:
@property (nonatomic) GeometryFlags geometryFlags;

// In .m file:
@synthesize geometryFlags = _geometryFlags;

然后,调用代码可以访问该属性以获取或设置位域。请注意,您可以使用按位OR运算符指定多个值:

// Uses the property accessor to modify two values in the bitmask.
someObj.geometryFlags = Parallelogram | Rhombus;

修改

有关如何使用位掩码的更多信息,请参阅以下内容:

How do those bitmasks actually work?

http://en.wikipedia.org/wiki/Mask_(computing)

http://en.wikipedia.org/wiki/Bitwise_operation

答案 1 :(得分:1)

KVC可以,例如:

BOOL isParallelogram = [[myPolygon valueForKey:@"parallelogram"] boolValue];

(参见键值编码编程指南中的Accessor Search Implementation Details

那就是说,我不推荐这种方法。它不仅效率低下,而且还会中断encapsulation。这正是属性所针对的,在这种情况下没有理由不使用它们。

答案 2 :(得分:1)

你不能创建一个方法,它接受变量的名称和值,然后将它分配给它吗?

答案 3 :(得分:0)

您可以声明@public

@interface Polygons : NSObject {
@public
//BOOL values for attributes
BOOL parallelogram;
BOOL rhombus;
BOOL square;
...

然后像这样访问它们:

mypolygon->square = NO;

然而,正如@omz解释的那样,这打破了封装。


您可以编写一个简单的脚本来为您生成属性。这是一个起点:

grep "BOOL [a-zA-Z0-9_]+;$" Polygons.h