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

bat*_*ilc 3 struct objective-c variable-assignment ios

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

在.h文件中我有:

struct MyState{
    float quantizer;
    BOOL isOpen;
};

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

@property (nonatomic,assign) struct MyState myState;
Run Code Online (Sandbox Code Playgroud)

在.m文件中,我有写和读取如下:

@synthesize myState

...
self.myState.isOpen = TRUE;
if(self.myState.isOpen)
    self.myState.quantizer = myQuantizerValue;
Run Code Online (Sandbox Code Playgroud)

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

self.myState->isOpen = TRUE;
Run Code Online (Sandbox Code Playgroud)

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

mat*_*att 7

这与您无法分配到size视图frame属性的原因相同.这是Objective-C的限制.请参阅本书本节末尾对此问题的讨论.正如我在那里解释的那样,您必须将struct属性值提取到变量中,更改结构的成员,并将其分配回属性:

struct MyState s = self.myState;
s.isOpen = YES;
self.myState = s;
Run Code Online (Sandbox Code Playgroud)

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

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

self->myState.isOpen = YES;
Run Code Online (Sandbox Code Playgroud)

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