“expression式是不可转让的” – 分配float的问题作为xCode中另外两个浮点数的总和?
在钢琴应用程序中,我正在分配黑键的坐标。 这是导致错误的代码行。
'blackKey'和'whiteKey'都是customViews
blackKey.center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
其他答案并不完全解释这里发生了什么,所以这是基本的问题:
当你写blackKey.center.x
, blackKey.center
和center.x
都看起来像结构成员访问,但实际上是完全不同的东西。 blackKey.center
是一个属性访问,它parsing成类似[blackKey center]
东西,然后desugars到类似objc_msgSend(blackKey, @selector(center))
。 你不能修改函数的返回值,比如objc_msgSend(blackKey, @selector(center)).x = 2
– 它只是没有意义,因为返回值没有存储在任何有意义的地方。
所以,如果你想修改结构,你必须将属性的返回值存储在variables中,修改variables,然后将属性设置为新的值。
如果它是对象的属性,则不能直接更改CGPoint
的x
值(或任何结构的值)。 做下面的事情。
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));