Подтвердить что ты не робот

Значение типа "String" не соответствует ожидаемому типу значения словаря "AnyObject"

Я получаю эту ошибку при создании словаря в Swift:

Значение типа 'String' не соответствует ожидаемому значению словаря type 'AnyObject'

код:

let joeSmith : [String : AnyObject] = ["Name" : "Joe Smith", "Height" : 42, "Soccer Expo" : true, "Guardian" : "Jim and Jan Smith"]
4b9b3361

Ответ 1

Swift 3

Прежде всего a String in Swift является структурой и не соответствует не AnyObject.

Решение № 1

Лучшее решение в Swift 3 меняет тип значения словаря от AnyObject до Any (включая String struct).

let joeSmith : [String : Any] = ["Name" : "Joe Smith", "Height" : 42, "Soccer Expo" : true, "Guardian" : "Jim and Jan Smith"]

Решение №2

Однако, если вы действительно хотите сохранить значение для словаря, определенного как AnyObject, вы можете заставить мост из String struct в класс NSString добавить as AnyObject, как показано ниже (я сделал то же самое для другого значения)

let joeSmith : [String : AnyObject] = [
    "Name" : "Joe Smith" as AnyObject,
    "Height" : 42 as AnyObject,
    "Soccer Expo" : true as AnyObject,
    "Guardian" : "Jim and Jan Smith" as AnyObject]

Swift 2

Проблема заключается в том, что вы определили значение вашего словаря AnyObject и String в Swift НЕ объекта, a struct.

введите описание изображения здесь

Компилятор жалуется на String, потому что это первая ошибка, но если вы удалите ее, она даст вам ошибку для 42, которая снова является Int и затем struct.

введите описание изображения здесь

И у вас будет такая же проблема с true (Bool → Struct).

введите описание изображения здесь

Вы можете решить эту проблему двумя способами:

Фонд № 1

Если вы добавите import Foundation, то структура Swift автоматически привязана к NSString (который является объектом), и компилятор счастлив

введите описание изображения здесь

Любой # 2

Вы заменяете AnyObject на Any. Теперь вы можете поместить любое значение в свой словарь.

введите здесь описание изображения

Вопросы

IMHO мы (разработчики Swift) должны постепенно останавливаться на мостике Objective-C и использовать второе решение.