web-dev-qa-db-ja.com

「式は代入可能ではありません」-Xcodeで他の2つのfloatの合計としてfloatを割り当てる際に問題がありますか?

ピアノアプリでは、黒のキーの座標を割り当てています。エラーの原因となっているコード行は次のとおりです。

「blackKey」と「whiteKey」は両方ともcustomViewsです

blackKey.center.x = (whiteKey.frame.Origin.x + whiteKey.frame.size.width);
41
Mahir

他の答えは、ここで何が起こっているかを正確に説明していないため、これが基本的な問題です。

_blackKey.center.x_を記述すると、_blackKey.center_と_center.x_は両方とも構造体メンバーアクセスのように見えますが、実際には完全に異なるものです。 _blackKey.center_はプロパティアクセスであり、_[blackKey center]_のようなものに脱糖され、次にobjc_msgSend(blackKey, @selector(center))のようなものに脱糖されます。 objc_msgSend(blackKey, @selector(center)).x = 2のように、関数の戻り値を変更することはできません。戻り値はstoredのどこにも意味がないため、意味がありません。

したがって、構造体を変更する場合は、プロパティの戻り値を変数に保存し、変数を変更してから、プロパティを新しい値に設定する必要があります。

82
Chuck

オブジェクトのプロパティである場合、x(または構造体の値)のCGPoint値をそのように直接変更することはできません。次のようなことをしてください。

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

それを行う1つの方法。

10
Dair

マクロを使用する1つの選択肢:

#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));
0
ThomasW

その意味として、値を式に割り当てることはできません。たとえば、a + b = cは禁止されています。

0
冯剑龙