Почему, если я приведу тип String? to Any, Xcode выдает предупреждение, но не с AnyObject?

Этот код выдает предупреждение «Выражение неявно приведено к строке?» любому."

let email : String?;
let password : String?;
let dict = ["email": email, "password": password] as [String: Any];

Но этого кода нет.

let email : String?;
let password : String?;
let dict = ["email": email, "password": password] as [String: AnyObject];

Почему? И как мне сделать так, чтобы Any не беспокоил меня предупреждением об опционах вроде AnyObject?

РЕДАКТИРОВАТЬ:

Этот код также не выдает предупреждение:

let email : String;
let password : String;
let dict = ["email": email, "password": password] as [String: Any];

Но в этом случае мне нужно иметь возможность включать как объект, так и необязательность. Кажется, предупреждение появляется только в том случае, если тип переменной является как объектом , так и необязательным.


person Chen Li Yong    schedule 06.02.2018    source источник
comment
Any может представлять экземпляр любого типа, включая типы функций и необязательные типы, а AnyObject может представлять экземпляр любого типа класса. Итак, в вашем случае String Object - это Class Object, поэтому он не дает предупреждения.   -  person Rocky    schedule 06.02.2018
comment
@Rocky, я обновил вопрос.   -  person Chen Li Yong    schedule 06.02.2018
comment
Необязательное значение словаря — это чепуха. Согласно определению словаря nil возвращается, если ключ не существует. Поэтому, если вы хотите значение nil, опустите ключ. И удалите конечные точки с запятой. Они бессмысленны в Swift.   -  person vadian    schedule 06.02.2018
comment
Необязательное значение словаря @vadian действительно ерунда. Проблема в том, что эти опции исходят из параметров. При использовании приведения типа к as [String: AnyObject] любое значение nil автоматически не включается в окончательный словарь. И да, точки с запятой бессмысленны. Но я переключаюсь между проектом Obj C и Swift, и вместо того, чтобы продолжать расстраиваться из-за того, что забыл поставить точку с запятой при работе с Obj C, я предпочитаю ставить дополнительные точки с запятой в Swift, просто чтобы не потерять рефлекс чтобы добавить точку с запятой после оператора.   -  person Chen Li Yong    schedule 06.02.2018


Ответы (1)


Согласно Руководству по языку Swift, вы должны чтобы получить предупреждение при приведении необязательного к Any (см. примечание внизу страницы). Вы можете избавиться от предупреждения, приведя необязательное значение к Any, как показано ниже.

let email : String?;
let password : String?;
let dict = ["email": email as Any, "password": password as Any] as [String: Any];
person Mika    schedule 06.02.2018
comment
Но это означает, что мне нужно добавить as Any к каждому значению. Я только что нашел обходной путь, то есть преобразовал его в [String: AnyObject], а затем привел в [String: Any]. Почему это возможно? - person Chen Li Yong; 06.02.2018
comment
Any может чем угодно, AnyObject каким-то объектом класса, но например это не может быть тип функции. Вы можете использовать Any вместо AnyObject, String и т. д., чтобы ваше приведение типов было действительным. И вы, вероятно, работаете с обычными объектами, поэтому использование AnyObject является хорошим решением. - person Mika; 06.02.2018