我已经使用CGPoint ivar和相关属性定义了一个对象,如下所示......
@interface Sprite : NSObject {
CGRect boundingBox;
}
@property(assign) CGRect boundingBox;
当我使用Sprite类的实例并尝试更新boundingBox结构时,如下所示......
self.boundingBox.origin.x = minX;
我收到编译时错误,说明......
Lvalue需要作为左操作数 分配
我是否正确地说self.boundingBox将返回一个C结构,它实际上不是Sprite对象所持有的结构,而是它的副本?因此,当为x的新值赋值失败时,因为struct只是一个临时副本?
如果是这种情况,以下代码是否正常工作(这是实现我想要的正确方法)吗?
CGRect newBoundingBox = self.boundingBox;
newBoundingBox.origin.x = self.boundingBox.origin.x;
self.boundingBox = newBoundingBox;
答案 0 :(得分:2)
请记住,属性只是setter和getter方法的语法别名。这样:
self.boundingBox = newBox;
等同于:
[self setBoundingBox:newBox];
你不能这样做的原因:
self.boundingBox.origin.x = minX;
是因为无法调用setBoundingBox:
但只是要求它更改origin.x
,并且没有单独的setter方法可用于结构的各个部分。问题末尾的示例是实现您通过属性尝试的唯一方法。
您可以忘记属性并执行此操作:
boundingBox.origin.x = minX
直接写入当前对象boundingBox
实例变量(假设存在一个),但是绕过了setter方法,这可能是不合需要的。
答案 1 :(得分:1)
编辑回答:我原来关于无法编辑任何CGRect的评论是错误的;第一行代码的实际问题来自于您使用self.boundingBox
访问CGRect
这一事实。你的第二个代码将会很好用,以及我在原始答案中的阻止:
要正确更改boundingBox
内的值,您需要使用apple的CGRectMake
函数,如下所示:
CGRect r = self.boundingBox;
self.boundingBox = CGRectMake(minX, r.y, r.width, r.height);
有关self.
符号为结构问题的原因的详细解释,请查看this question的答案。希望这有帮助!