web-dev-qa-db-fra.com

"L'expression n'est pas assignable" - Un problème pour assigner float à la somme de deux autres float dans xCode?

Dans une application de piano, j'attribue les coordonnées des touches noires . Voici la ligne de code à l'origine de l'erreur.

'blackKey' et 'whiteKey' sont les deux customViews

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

Les autres réponses n'expliquent pas exactement ce qui se passe ici, c'est donc le problème de base:

Lorsque vous écrivez blackKey.center.x, les blackKey.center et center.x ressemblent tous les deux à des accès de membre struct, mais ce sont en réalité des choses complètement différentes. blackKey.center est un accès à la propriété, qui désugue quelque chose comme [blackKey center], qui à son tour désugare quelque chose comme objc_msgSend(blackKey, @selector(center)). Vous ne pouvez pas modifier la valeur de retour d'une fonction, telle que objc_msgSend(blackKey, @selector(center)).x = 2 - cela n'a aucun sens, car la valeur de retour n'est pas stocké significatif.

Ainsi, si vous souhaitez modifier la structure, vous devez stocker la valeur de retour de la propriété dans une variable, modifier la variable, puis définir la propriété sur la nouvelle valeur.

82
Chuck

Vous ne pouvez pas changer directement la valeur x d'une CGPoint (ou de toute valeur d'une structure) de cette manière, s'il s'agit d'une propriété d'un objet. Faites quelque chose comme ce qui suit.

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

Une façon de le faire.

10
Dair

Une alternative utilisant des 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);

ou légèrement plus simple:

CGPOINT_SETX(blackKey.center, CGRectGetMaxX(whiteKey.frame));
0
ThomasW