2013-08-09 4 views
0

У меня есть пользовательский объект со свойством 'ago'.Точечный синтаксис внутри объекта массива

Если я хочу Acces это свойство, можно использовать

object.age 

Если теперь у меня есть массив пользовательских объектов, имеющих свойство «возраст», я бы ожидать, чтобы иметь возможность получить доступ к возрасту как это (пятый объект в массиве)

myArray[4].age 

, но он работает только в скобки синтаксиса

[myArray[4] age] 

Нет ли синтаксиса точек в массивах, или что я пропущу?

Заранее спасибо

ответ

2

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

id x = array[4]; 
float age = [x age]; 

SomeClass *x = array[4]; 
float age = x.age; 

Пожалуйста, обратите внимание, что первая версия довольно рискованна. Я имел дело с унаследованным кодом в одном проекте, который выглядел примерно так:

NSString *recommendation = [[[[[[[dataArray 
    objectAtIndex:indexPath.section] mainPerson] friends] 
    objectAtIndex:indexPath.row] recommendations] 
    objectAtIndex:0] title]; 

Каждый объект был пользовательский класс. Каждое сообщение является потенциальным сбоем. Кошмар для отладки.

Мой совет: не ходите туда и не пользуйтесь сильной поддержкой печати компилятора.

Лучше написать несколько строк кода и не запускать случайные сообщения на непредсказуемых и непроверенных объектах.

+0

спасибо за совет! – brainray

+1

Я все еще думаю, что мой ответ лучше, чем тот, который вы приняли. Сделать точечную нотацию, возможную с помощью актера, еще более запутанно и безответственно, чем просто стрелять сообщениями на объекты. – Mundi

+0

ваши права, я изменил принятый ответ на ваш. – brainray

-4

[[туАггау objectAtIndex: 4] возраст]

+0

Это может ответить на вопрос, но желательно добавить немного описания с ответом. В противном случае есть все шансы, что вы ответите, могут быть удалены как «Очень низкое качество». – Krishnabhadra

+0

в порядке, но с новым синтаксисом без objectAtIndex? – brainray

+0

Он уже нормально отправляет сообщение. Он хочет использовать точечный синтаксис. –

1

Объектив-C не имеет строго типизированных коллекций, так как это динамически типизированный язык. Поэтому компилятор не может знать тип объектов, хранящихся в коллекции (массив в этом случае), поэтому вы не можете использовать точечный синтаксис. Ошибка, которую дает вам компилятор: Property 'age' is not found on object of type 'id', в которой говорится, что объект, возвращенный из коллекции, имеет тип id.

Если вы хотите использовать точечную нотацию вы должны включать в себя роли:

NSUInteger age = ((MyClass *) myArray[4]).age;

Помимо того, что немного некрасиво, я бы сделал это, только если вы 100% уверены, что вы знаете, что массив будет содержать только объекты типа MyClass.