基本上,我有一个带有很多布尔变量的自定义NSObject。我想知道是否有办法修改这些变量(来自这个类之外)而不为每个变量创建一个属性。这可能吗?提前致谢! 这是我对象标题的一部分:
@interface Polygons : NSObject {
//BOOL values for attributes
BOOL parallelogram;
BOOL rhombus;
BOOL square;
...
}
答案 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?
答案 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