2016-03-09 3 views
2

Существуют ли предупреждения, позволяющие прекратить назначать литералы массива и словаря переменным с типичными типами, которые не совпадают?Objective-C Generics-Safe Array/Dictionary Literal

// I expect a warning here. 
// I'm assigning an NSArray<NSNumber *> to an NSArray<NSString *> 
NSArray<NSString *> *strings = @[@1, 
           @2, 
           @3, 
           ]; 

// I expect a warning here. 
// NSDictionary<NSNumber *, NSNumber *> to an 
// NSDictionary<NSString *, NSString *> 
NSDictionary<NSString *, NSString *> *stringsByString = @{@1 : @1, 
                  @2 : @2, 
                  @3 : @3, 
                  }; 

Я создал новый проект IOS с Xcode версии 7.2 (7C68), и я не получил никаких предупреждений для вышеупомянутых назначений.

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

NSMutableArray<NSString *> *strings = [NSMutableArray new]; 
[strings addObject:@1]; 

Несовместимые типы указателей отправки «NSNumber *» для параметра типа «NSString * _Nonnull»

NSMutableDictionary<NSString *, NSString *> *stringsByString = [NSMutableDictionary new]; 
stringsByString[@"1"] = @1; 

Несовместимые типы указателей отправки «NSNumber * 'к параметру типа' NSString * _Nullable '

Но я надеялся на что-то более сжатое.

Весь этот вопрос более широк, чем просто позвонить -\[NSMutableDictionary setObject:forKey:\which doesn't work.

stringsByString[@2] = @"2"; 

ответ

1

Нет, в Objective-C не существует никакого вывода типа. Следовательно, массивные и словарные литералы ничего не знают о том, в каком контексте они используются, и должны обязательно допускать что-либо в качестве ключей и значений.

+0

Если вы можете ссылаться на документацию или какое-либо официальное слово от кого-то из Apple (твит или письмо), я буду рад отметить это правильно. –