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