Objective-C结构定义和修改会产生错误'Expression not assignable'?

时间:2015-03-07 01:13:50

标签: ios objective-c struct variable-assignment

我一直在阅读其他类似的问题,但这些解决方案要么不适合我们不能解决我手中的问题。我的代码实际上非常简单,我不知道我应该怎么做我想要的。确定:

在.h文件中我有:

struct MyState{
    float quantizer;
    BOOL isOpen;
};

@interface ... {
    ...
    struct MyState myState;
}

@property (nonatomic,assign) struct MyState myState;

在.m文件中,我写了如下的内容:

@synthesize myState

...
self.myState.isOpen = TRUE;
if(self.myState.isOpen)
    self.myState.quantizer = myQuantizerValue;

现在,XCode不接受'。'访问运营商。它说'表达不可分配'。我尝试将myState更改为指针并将我的读/写转换为用户' - >'运营商如:

self.myState->isOpen = TRUE;

然后它给出了赋值的运行时错误。如何以简单的方式访问和修改这些属性?我想使用结构构造函数,以避免为MyStruct中的每个属性声明和合成单独的变量。

3 个答案:

答案 0 :(得分:7)

这与您无法分配到size视图frame属性的struct MyState s = self.myState; s.isOpen = YES; self.myState = s; 的原因相同。它是Objective-C的一个限制。请参阅this section of my book末尾对此问题的讨论。正如我在那里解释的那样,你必须将struct属性值提取到变量中,更改结构的成员,并将其分配回属性:

self.myState

基本上这是因为" dot"在myState.isOpen中完全不同于" dot"在myState。第一个是对self->myState.isOpen = YES; 方法的Objective-C调用,并返回一个结构。第二个是对结构成员的C访问。

另一种方法是首先不使用Objective-C属性:直接访问实例变量:

{{1}}

但是当然你不能在没有公开这个实例变量的情况下从其他类中做到这一点......

答案 1 :(得分:1)

我认为你不能做你想做的事情。您不能将结构化为属性,并为结构的其中一个元素赋值。相反,您必须设置一个包含相同结构的局部变量,对其进行配置,然后将整个结构分配给该属性:

MyState aStruct;

aStruct.isOpen = TRUE;
aStruct.quantizer = myQuantizerValue;

self.myState = aStruct;

请注意,出于同样的原因,视图的框架和边界属性也存在同样的问题。

CGRect是一个结构。该视图具有边界CGRect属性。

你不能说

myView.bounds.origin.x = 70;

相反,你必须说;

CGRect bounds = myView.bounds;
bounds.origin.x = 70;

myView.bounds = bounds;

编辑:废话,它看起来像马特和我给出了相同的答案,但他在发送按钮上更快。

答案 2 :(得分:1)

直接访问结构,因为" dot"在self.myState中是客观的C和" dot"在myState.isOpen中是一个' C' member struct,改为使用下划线 _myState.isOpen = TRUE;

相关问题