Objective-C 结构定义和修改给出错误 'Expression not assignable'?

Objective-C struct definition and modification gives error 'Expression not assignable'?

我一直在阅读其他类似的问题,但这些解决方案要么不适合我们,要么无法解决我手头的问题。我的代码其实很简单,我不知道我应该怎么做我想做的。好的:

在 .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 将不接受使用“.”进行访问。操作员。它说 'Expression is not assignable'。我尝试将 myState 更改为指针并将我的 read/write 转换为用户 '->' 运算符,例如:

self.myState->isOpen = TRUE;

然后它在赋值时给出运行时错误。我应该怎么做才能以简单的方式访问和修改这些属性?我想使用结构构造函数只是为了避免在 MyStruct.

中为每个 属性 声明和合成单独的变量

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

struct MyState s = self.myState;
s.isOpen = YES;
self.myState = s;

基本上这是因为self.myState中的"dot"与myState.isOpen中的"dot"完全不同。第一个是 Objective-C 调用 myState 方法 和 returns 结构。第二个是对结构成员的 C 访问。

备选方案就是首先不使用 Objective-C 属性:直接访问实例变量:

self->myState.isOpen = YES;

但是,如果不创建此实例变量 public...

,您当然不能从其他 class 执行此操作

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

MyState aStruct;

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

self.myState = aStruct;

请注意,出于同样的原因,您对视图的 frame 和 bounds 属性也有同样的问题。

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

你不能说

myView.bounds.origin.x = 70;

相反你不得不说;

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

myView.bounds = bounds;

编辑:糟糕,看起来 Matt 和我给出了基本相同的答案,但他在发送按钮上更快。

直接访问结构,因为 self.myState 中的 "dot" 是 objective C 而 myState.isOpen 中的 "dot" 是 'C' 成员结构,使用下划线代替。
_myState.isOpen = 真;