“expression式是不可转让的” – 分配float的问题作为xCode中另外两个浮点数的总和?

在钢琴应用程序中,我正在分配黑键的坐标。 这是导致错误的代码行。

'blackKey'和'whiteKey'都是customViews

blackKey.center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width); 

其他答案并不完全解释这里发生了什么,所以这是基本的问题:

当你写blackKey.center.xblackKey.centercenter.x都看起来像结构成员访问,但实际上是完全不同的东西。 blackKey.center是一个属性访问,它parsing成类似[blackKey center]东西,然后desugars到类似objc_msgSend(blackKey, @selector(center)) 。 你不能修改函数的返回值,比如objc_msgSend(blackKey, @selector(center)).x = 2 – 它只是没有意义,因为返回值没有存储在任何有意义的地方。

所以,如果你想修改结构,你必须将属性的返回值存储在variables中,修改variables,然后将属性设置为新的值。

如果它是对象的属性,则不能直接更改CGPointx值(或任何结构的值)。 做下面的事情。

 CGPoint _center = blackKey.center; _center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width); blackKey.center = _center; 
 blackKey.center = CGPointMake ( whiteKey.frame.origin.x + whiteKey.frame.size.width, blackKey.center.y); 

一种做法。

使用macros的一种替代方法是:

 #define CGPOINT_SETX(point, x_value) { \ CGPoint tempPoint = point; \ tempPoint.x = (x_value); \ point = tempPoint; \ } #define CGPOINT_SETY(point, y_value) { \ CGPoint tempPoint = point; \ tempPoint.y = (y_value); \ point = tempPoint; \ } CGPOINT_SETX(blackKey.center, whiteKey.frame.origin.x + whiteKey.frame.size.width); 

或稍微简单一点:

 CGPOINT_SETX(blackKey.center, CGRectGetMaxX(whiteKey.frame));