Нужно использовать Objective C, чтобы использовать точечную запись?

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

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

«Запрос члена« readAt »в чем-то, кроме структуры или объединения»

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

Работает как положено. Потом...

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

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

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


person Newy    schedule 17.02.2011    source источник
comment
Является ли NotificationItem подклассом TTTableLinkedItem, и если да, то является ли он подклассом sbu, в котором вы объявили свойство readAt?   -  person Carl Veazey    schedule 17.02.2011


Ответы (2)


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

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

person Chuck    schedule 17.02.2011

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

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

person Ken Wayne VanderLinde    schedule 17.02.2011