Почему Xcode говорит, что следующее выражение не может быть назначено?

#objective-c #ios

#objective-c #iOS

Вопрос:

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

notesHeight — это CGFloat.

Комментарии:

1. self.MessageView.frame.size.height может быть доступен только для чтения?

Ответ №1:

Вы можете назначить фрейм, но не поля фрейма

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

Комментарии:

1. Примечание: Фрейм не имеет свойств, у него есть поля.

Ответ №2:

Точечный синтаксис — это просто синтаксический сахар.

В этом случае этот код:

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

Отбрасывая синтаксис точки, который в некоторых случаях вызывает путаницу в отношении того, что именно происходит, это выглядит следующим образом:

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

В терминах C это выглядит следующим образом:

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

Вы не можете задать поле структуры результата функции таким образом. (И даже если бы вы могли, это повлияло бы не на оригинал, а только на копию.)

Обратите внимание, что Apple обрабатывает некоторые другие вещи, которые, похоже, не должны автоматически работать на основе этих правил (хотя они этого не делали, когда синтаксис dot был впервые введен).

Предполагая, что foo является свойством NSInteger, например:

 self.foo  ;
  

В статье Википедии о значении есть раздел о присвоении, который может прояснить проблему strut:

Я не знаю ни одного места, где Apple определяет вещи, которые все равно работают…

Комментарии:

1. Это лучший ответ. Отличное объяснение.

2. К сожалению, Apple немного запутала это в последние годы. Спасибо, что снова привлекли мое внимание. 🙂