Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 有没有一种方法可以为NSObjects设置变量而不为每个对象创建属性?_Iphone_Objective C_Ios - Fatal编程技术网

Iphone 有没有一种方法可以为NSObjects设置变量而不为每个对象创建属性?

Iphone 有没有一种方法可以为NSObjects设置变量而不为每个对象创建属性?,iphone,objective-c,ios,Iphone,Objective C,Ios,基本上,我有一个带有很多布尔变量的自定义NSObject。我想知道是否有一种方法可以在不为每个变量创建属性的情况下(从类外部)修改这些变量。这可能吗?提前谢谢! 这是我的对象标题的一部分: @interface Polygons : NSObject { //BOOL values for attributes BOOL parallelogram; BOOL rhombus; BOOL square; ... } 可以使用KVC,例如: BOOL isParallelogram = [

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

@interface Polygons : NSObject {

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

...

}

可以使用KVC,例如:

BOOL isParallelogram = [[myPolygon valueForKey:@"parallelogram"] boolValue];
(请参见《键值编码编程指南》中的)


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

您可以声明它们
@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

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

使用位掩码来表示一组相关的布尔属性。首先,定义一个枚举,如下所示:

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

    // etc.
};
然后,您可以定义一个属性以允许外部调用方访问位掩码:

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

// In .m file:
@synthesize geometryFlags = _geometryFlags;
然后调用代码可以访问属性以获取或设置位字段。请注意,可以使用按位或运算符指定多个值:

// Uses the property accessor to modify two values in the bitmask.
someObj.geometryFlags = Parallelogram | Rhombus;
编辑 有关如何使用位掩码的详细信息,请参见以下内容:


谢谢你的回复和建议,我可能会写下这段脚本。另外请注意,当使用->操作符时,如果多边形为零,你的应用程序将崩溃。谢谢你的想法!但是,我不熟悉位字段和枚举。你能提供一个链接,我可以在那里读到它们吗?再次感谢@Garrett回想起来,我应该说“位掩码”而不是“位域”。我已经相应地更新了我的答案,还为你添加了一些链接。非常感谢!现在这更有意义了
// Uses the property accessor to modify two values in the bitmask.
someObj.geometryFlags = Parallelogram | Rhombus;