“表达式不可分配”——将浮点数分配为 Xcode 中其他两个浮点数的总和时出现问题?
Posted
技术标签:
【中文标题】“表达式不可分配”——将浮点数分配为 Xcode 中其他两个浮点数的总和时出现问题?【英文标题】:"Expression is not assignable" -- Problem assigning float as sum of two other floats in Xcode? 【发布时间】:2011-10-27 19:31:13 【问题描述】:在钢琴应用程序中,我正在分配黑键的坐标。 这是导致错误的代码行。
'blackKey' 和 'whiteKey' 都是 customViews
blackKey.center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
【问题讨论】:
请注意whiteKey.frame.origin.x + whiteKey.frame.size.width
与CGRectGetMaxX(whiteKey.frame)
相同。
【参考方案1】:
其他答案并不能完全解释这里发生了什么,所以这是基本问题:
当您编写blackKey.center.x
时,blackKey.center
和center.x
看起来都像结构成员访问,但它们实际上是完全不同的东西。 blackKey.center
是一个属性访问,它脱糖为[blackKey center]
之类的东西,而后者又脱糖为objc_msgSend(blackKey, @selector(center))
之类的东西。您不能修改函数的返回值,例如 objc_msgSend(blackKey, @selector(center)).x = 2
— 它只是没有意义,因为返回值没有存储任何有意义的地方。
所以如果要修改struct,就得把属性的返回值存储在一个变量中,修改变量,然后将属性设置为新的值。
【讨论】:
我们可以设置anObject.anNonStructProperty.anProperty = someValue
对吧?怎么说我们不能修改函数的返回值。你能解释一下吗?
@EmptyStack:当你写anObject.someProperty = something
时,它不等于[anObject someProperty] = something
——相反,它等于[anObject setSomeProperty:something]
。您正在向对象发送消息以调用 setter 方法。您没有分配给方法的返回值。赋值的出现只是语法糖,就像成员访问的出现是 getter 方法的语法糖一样。
我还是没搞清楚。即使在您的回答中,blackKey.center
在内部调用 objc_msgSend(blackKey, @selector(setCenter:))
而不是 objc_msgSend(blackKey, @selector(center))
对吗?
@Adithya:不。如果您认为blackKey.center
调用setCenter:
,那么您认为争论是什么? [blackKey setCenter: ?????]
。只是[blackKey center]
。【参考方案2】:
如果 x
是对象的属性,则不能像这样直接更改 CGPoint
(或结构的任何值)的 x
值。执行以下操作。
CGPoint _center = blackKey.center;
_center.x = (whiteKey.frame.origin.x + whiteKey.frame.size.width);
blackKey.center = _center;
【讨论】:
【参考方案3】:blackKey.center = CGPointMake ( whiteKey.frame.origin.x + whiteKey.frame.size.width, blackKey.center.y);
一种方法。
【讨论】:
【参考方案4】:使用宏的另一种选择:
#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));
【讨论】:
你真的需要do ... while(0)
吗?块作用域 ...
是否不足以声明临时变量(没有可能与外部的东西发生名称冲突),并且其中的语句只执行一次?
@NicolasMiari 我使用do ... while(0)
已经很长时间了,以至于我没有意识到...
块工作得很好。谢谢。简化。
do ... while(0)
的原因在这里:***.com/questions/154136/… 就我而言,这不是必需的,但在某些情况下是必要的。【参考方案5】:
就其含义而言,您不能为表达式赋值。例如,a + b = c 是禁止的。
【讨论】:
以上是关于“表达式不可分配”——将浮点数分配为 Xcode 中其他两个浮点数的总和时出现问题?的主要内容,如果未能解决你的问题,请参考以下文章
Objective-C 结构定义和修改给出错误“表达式不可分配”?
何时使用 trunc() 而不是 int() 将浮点类型数转换为整数更好?