“Expresión no es asignable” – Problema que asigna flotación como sum de otros dos flotantes en xCode?

En una aplicación de piano, estoy asignando las coordenadas de las teclas negras. Aquí está la línea de código que causa el error.

‘blackKey’ y ‘whiteKey’ son ambas vistas personalizadas

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

Las otras respuestas no explican exactamente qué está pasando aquí, entonces este es el problema básico:

Cuando escribe blackKey.center.x , tanto center.x como center.x parecen accesos a miembros de estructura, pero en realidad son cosas completamente diferentes. blackKey.center es un acceso a la propiedad, que se deshace en algo como [blackKey center] , que a su vez se convierte en algo parecido a objc_msgSend(blackKey, @selector(center)) . No puede modificar el valor de retorno de una función, como objc_msgSend(blackKey, @selector(center)).x = 2 – simplemente no es significativo, porque el valor de retorno no se almacena en ningún lugar significativo.

Por lo tanto, si desea modificar la estructura, debe almacenar el valor de retorno de la propiedad en una variable, modificar la variable y luego establecer la propiedad en el nuevo valor.

No puede cambiar directamente el valor x de un CGPoint (o cualquier valor de una estructura) como ese, si es una propiedad de un objeto. Haz algo como lo siguiente.

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

Una forma de hacerlo.

Una alternativa usando macros:

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

o un poco más simple:

 CGPOINT_SETX(blackKey.center, CGRectGetMaxX(whiteKey.frame)); 
Intereting Posts