2014-02-11 5 views
-3

Учитывая массивБудет ли для в цикле самоанализом содержимое массива

NSArray *myArray = @[@"hello", @5, @[@6, @7, @8]]; 
for (NSNumber *myNumber in myArray) 
{ 
    NSLog (@"%@", myNumber); 
} 

ли выход из сообщения журнала будет 5 или 5 6 7 8 т. Включает ли цикл for/in объекты верхнего уровня в словаре/массиве или глубоко проверять вложенные наборы, массивы, словари и т. Д.?

Редактировать

Я понимаю, что я везу много тепла на этот вопрос, поэтому позвольте мне уточнить, что я получал в. Да, все в порядке, для быстрого перечисления не выполняется самоанализ, но почему бы и нет? Если я специально обозначаю тип, например NSNumber или NSString, почему цикл for in не выполняет метод kindOfClass с типом, который вы указали, а не каким-то другим объектом? В приведенном выше примере не интуитивно понятно, что я бы выполнял только повторение NSNumbers в массиве?

Я подозреваю, что ответ выполняет интроспекцию по каждому элементу в массиве, может отрицать улучшения производительности быстрого перечисления? Но разве это невозможно решить с использованием id, когда мы хотим динамического ввода и явных типов, когда хотим выполнить интроспекцию?

+4

Что произошло, когда вы попробовали? –

+0

Предложение: найдите время, чтобы изучить и понять итерацию/перечисление (это не интроспекция). Как Josh комментирует: попробуйте, а также достаточно разных конфигураций, которые вы полностью понимаете для цикла in-in и массивов с элементами массива. – zaph

+0

Как может любой быть таким ленивым, чтобы спросить «что бы произошло?» И я запустил этот код? ???? – matt

ответ

3

Ваш код будет генерировать:

"hello" 
5 
(6, 7, 8) 

Несколько комментариев ...

1) цикл только перечисляет один уровень любого объекта вы перечисляя, поэтому он не идет вниз уровни.

2) Вы должны быть осторожны, чтобы убедиться, что переменная цикла является правильным. Не каждый элемент вашего NSArray является NSNumber. Если вы попытаетесь отправить сообщение, относящееся к NSNumber, вы получите ошибку во время выполнения.

3) Ваш код не падает, потому что с использованием %@ с NSLog отправляет сообщение description объекту, который реализуется всеми элементами массива. В вашем примере вы все равно должны сделать myNumber типа id, однако, если вы на 100% уверены, что все в массиве на самом деле NSNumber.

+0

Обычно массив будет содержать только один тип. – zaph

+0

@ Zaph это кроме того пункт. – altyus

+0

@ godel9 Я получаю это, мне более любопытно, почему for-in не реализует интроспекцию при указании типа. – altyus