混合C结构和Objective-C属性

时间:2010-12-05 17:16:13

标签: objective-c

我已经使用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;

2 个答案:

答案 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的答案。希望这有帮助!