«Выражение не присваивается» - проблема с назначением числа с плавающей точкой как суммы двух других чисел в xCode? - PullRequest
41 голосов
/ 16 августа 2011

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

'blackKey' и 'whiteKey' - это пользовательские виды

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

Ответы [ 4 ]

82 голосов
/ 16 августа 2011

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

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

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

19 голосов
/ 16 августа 2011

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

CGPoint _center = blackKey.center;
_center.x =  (whiteKey.frame.origin.x + whiteKey.frame.size.width);
blackKey.center = _center;
10 голосов
/ 16 августа 2011
blackKey.center = CGPointMake ( whiteKey.frame.origin.x + whiteKey.frame.size.width, blackKey.center.y);

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

0 голосов
/ 09 сентября 2015

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

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