“表达式不可分配”——将浮点数分配为 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.widthCGRectGetMaxX(whiteKey.frame) 相同。 【参考方案1】:

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

当您编写blackKey.center.x 时,blackKey.centercenter.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 结构定义和修改给出错误“表达式不可分配”?

将字符串浮点数列表转换为具有 2 个小数点的浮点数列表

何时使用 trunc() 而不是 int() 将浮点类型数转换为整数更好?

Python 使用省略号或无 + 浮点类型提示未分配属性

将十进制数表示成ieee754标准的32浮点规格化数 27/64

是否可以保真地将浮点双精度数往返于两个十进制整数?