@interface some_class : some_parent {
}
@property (nonatomic, assign) CGRect the_rect;
@end
...
@implementation some_class
@synthesize the_rect;
@end
Run Code Online (Sandbox Code Playgroud)
创建some_class的实例后:
instance_of_some_class.the_rect.origin.x = 0.0;
Run Code Online (Sandbox Code Playgroud)
这会生成"表达式无法分配"错误.
当然这很好用:
instance_of_some_class.the_rect = CGRectMake(0,0,0,0);
Run Code Online (Sandbox Code Playgroud)
我想问题是,自动神奇创建的setter只知道将CGRect分配给"the_rect".好的,我明白了.我可以告诉它不要创建一个setter,这样我就可以直接访问成员变量并对struct成员进行赋值而不必分配整个CGRect吗?
我想我可以将它分解为四个单独的CGFloats for origin.x,origin.y,size.width和size.height ...但是你会认为有一种方法可以用CGRects来做到这一点.
令人困惑的是,这当然可行:
CGRect test = instance_of_some_class.the_rect.origin.x;
Run Code Online (Sandbox Code Playgroud)
换句话说,getter知道如何导航struct并提取其中一个元素的值,以便我可以使用它.相反的情况似乎并非如此,因为你无法进入一个恰好是结构的ivar,并且无需分配整个结构就可以对其中一个元素进行赋值.
我也试过这个:
@interface some_class : some_parent {
@public
CGRect the_rect;
}
@property (nonatomic, assign) CGRect the_rect;
@end
Run Code Online (Sandbox Code Playgroud)
在另一个模块中实例化之后:
instance.the_rect->origin.x = some_value;
Run Code Online (Sandbox Code Playgroud)
...并且得到一个错误,说被引用的成员不是指针.我尝试使用instance.the_rect的地址......但这也不起作用.
EDIT TO CLARIFY:这是关于创建一个类似于结构的ivars的类.然后,在将类实例化到其他地方后,您希望能够直接对struct ivar元素进行赋值:
class_instance.struct_ivar.element = something;
Run Code Online (Sandbox Code Playgroud)
我正在使用CGRect作为一个众所周知的结构的一个方便的例子,人们可能希望将其用作ivar.