2015-11-27 4 views
4

Я экспериментировал с безопасностью типа в объективе c некоторое время. Я думаю, что у меня есть некоторые из них, но мне интересно, возможно ли следующее.Тип безопасности в петле

NSMutableArray <NSNumber *> *x = [NSMutableArray new]; 
[x addObject:@14]; 
[x addObject:@"s"]; // <--- Gives warning, good! 

for (NSUInteger i = 0; i < x.count; i++) { 
    NSString *s = [x objectAtIndex:i]; // <-- Gives warning, good! 
} 

NSString *d = x[0]; // <-- Gives warning, good! 


//but 
for (NSString *s in x) // <-- expected warning but didn't get it 
    NSLog(@"%@", [s stringByAppendingString:@"s"]; // <-- no warning just run time error 

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

+0

Obj-C не реализует дженерики. На самом деле, нет. Эти дженерики существуют для поддержки Swift. Это не означает, что они будут применяться в коде Obj-C. Возможно, в будущем, но, к сожалению, это связано с проблемами совместимости, поэтому я не думаю, что это вероятно. – Sulthan

+0

Если человек, который дал минус, мог бы объяснить это, что было бы здорово! Я действительно хочу понять эту тему. Так что, если я неясен или просто глупый, просто скажите мне – Haagenti

+0

Наверное, просто недосмотр в компиляторе. –

ответ

2

Вот проблема.

Большинство методов в NSArray/NSMutableArray, таких как addObject: и objectAtIndexedSubscript: (который позволяет для современного [index] синтаксиса) принимать или возвращать ObjectType значения. ObjectType - это специальный индикатор, который означает «использовать общий тип», указанный для массива.

Быстрое перечисление происходит из протокола NSFastEnumeration и его метода countByEnumeratingWithState:objects:count:. К сожалению, параметр objects является C-массивом id. Он не использует ObjectType. Поскольку объекты являются типами id, компилятор не может выполнять проверку типа, как это может, для других методов NSArray.

0

его ошибка. детали реализации, такие как NSFastEnumeration, не имеют значения. они должны хотя бы проверить это на проходе анализатора, если им не удастся выпустить предупреждение. пожалуйста, сообщите об ошибках в Apple и LLVM.

Смежные вопросы