Нужно привести в Objective C к точечной нотации? - PullRequest
0 голосов
/ 17 февраля 2011

Это в контексте использования Three20, но, вероятно, больше относится к чему-то, что я не получаю без цели C. Я нахожусь в TTTableLinkedItemCell и просто пытаюсь присвоить свойство с именем readAt.

//_item.readAt = [[NSDate alloc] init];

"Запрос на член 'readAt' в чем-то, не являющемся структурой или объединением"

[_item setReadAt: [[NSDate alloc] init]];

Работает как положено. Тогда ...

((NotificationItem *)_item).readAt = [[NSDate alloc] init];

Также работает. Кажется, мне нужно привести в заблуждение, чтобы использовать точечную нотацию, но Obj-C будет радостно передавать сообщения вслепую? Это правильное правило, которое я убираю из этого?

PS: _item, согласно API Three20: TTTableLinkedItem * _item.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

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

Так зачем ему знать статический тип для средства доступа к свойству? Поскольку свойство может назначать любой метод для получения или установки, а не только для пары по умолчанию foo и setFoo:, поэтому компилятору необходимо знать, какое это свойство, чтобы генерировать правильные вызовы метода доступа. *

1 голос
/ 17 февраля 2011

Эта страница посвящена смежному вопросу, хотя она касается ваших собственных занятий. Там упоминается, что для того, чтобы компилятор распознал свойство суперкласса при использовании подкласса, файл реализации подкласса должен импортировать файл заголовка суперкласса.

Кажется, что TTTableLinkedItemCell этого не делает, поэтому вы застряли либо с приведением, либо с использованием обычного синтаксиса сообщения. Ни один из них не идеален, но он как-то вне вашего контроля.

...