¿Por qué XCode dice que la siguiente expresión no es asignable?

self.messageView.frame.size.height = self.messageView.frame.size.height + notesHeight; 

notesHeight es un CGFloat.

Puede asignar el marco, pero no los campos del marco.

 CGRect temp = self.messageView.frame; temp.size.height = temp.size.height + notesHeight; self.messageView.frame = temp; 

La syntax de punto es solo azúcar syntax.

En este caso, este código:

 self.messageView.frame.size.height = 0; 

Dejar caer la syntax de puntos, que causa confusión en algunos casos sobre exactamente lo que está sucediendo, se ve así:

 [[self messageView] frame].size.height = 0; 

En términos C, eso es así:

 ViewGetFrame(GetMessageView(self)).size.height = 0; 

No puede establecer un campo de una estructura de resultado de function de esta manera. (E incluso si pudieras, no afectaría el original, sino solo una copy).

El artículo de Wikipedia sobre Valor tiene una sección sobre la asignación que podría aclarar esto:

  • Valor (informática) , Asignación: valores l y valores r