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 = 真;
我一直在阅读其他类似的问题,但这些解决方案要么不适合我们,要么无法解决我手头的问题。我的代码其实很简单,我不知道我应该怎么做我想做的。好的:
在 .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 = 真;