"Expression is not assignable" - проблема с назначением float как суммы двух других поплавков в xCode?

в приложении для фортепиано я назначаю координаты черных клавиш. Вот строка кода вызывает ошибку.

'blackKey' и 'whiteKey' оба customViews

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

4 ответов


другие ответы точно не объясняют, что здесь происходит, поэтому это основная проблема:

когда вы пишите blackKey.center.x, the blackKey.center и center.x оба выглядят как доступ к элементам структуры, но на самом деле это совершенно разные вещи. blackKey.center - это доступ к свойству, который desugars к чему-то вроде [blackKey center], который в свою очередь десугарс к чему-то вроде objc_msgSend(blackKey, @selector(center)). Вы не можете изменить возвращаемое значение функции, как objc_msgSend(blackKey, @selector(center)).x = 2 - это просто не имеет смысла, потому что возвращение значение не хранящиеся везде смысл.

поэтому, если вы хотите изменить структуру, вы должны сохранить возвращаемое значение свойства в переменной, изменить переменную, а затем установить свойство в новое значение.


вы не можете напрямую изменить x стоимостью CGPoint(или любое значение структуры), если это свойство объекта. Сделать что-то вроде следующего.

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);

один из способов сделать это.


одна альтернатива с использованием макросов:

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