Этот код:
[anArray objectAtIndex:0].aVariable
Можно разбить на 2 раздела:
[anArray objectAtIndex:0]
Это возвращает id
- потому что вы можете поместить любой тип объекта в массив. Компилятор не знает, какой тип будет возвращен этим методом.
.aVariable
Это запрашивает свойство aVariable
для объекта, возвращаемого из массива - как указано выше, компилятор не знает, что это за объект - он, конечно, не будет предполагать, что это AnObject
, просто потому, что это то, что вы добавили одну или две строки ранее. Он должен оценивать каждое утверждение самостоятельно. Поэтому компилятор выдает ошибку.
Это немного более простительно при использовании методов доступа:
[[anArray objectAtIndex:0] aVariable];
Это даст вам предупреждение (что объект может не реагировать на селектор), но все равно позволит вам запустить код, и, к счастью, ваш объект отвечает на этот селектор, так что вы не не терпит крах Однако на это нельзя полагаться. Предупреждения компилятора - ваши друзья.
Если вы хотите использовать точечную нотацию, вам нужно сообщить компилятору, какой тип объекта возвращается из массива. Это называется casting . Вы можете сделать это в два этапа:
AnObject *returnedObject = [anArray objectAtIndex:0];
int value = returnedObject.aVariable;
Или с кучей скобок:
int value = ((AnObject*)[anArray objectAtIndex:0]).aVariable;
Дополнительные скобки необходимы, чтобы вы могли использовать точечную нотацию при приведении. Если вы хотите использовать методы доступа, вам нужно меньше круглых скобок, но больше квадратных скобок:
int value = [(AnObject*)[anArray objectAtIndex:0] aVariable];