Вывод закрытия в Swift - PullRequest
0 голосов
/ 10 июля 2020

Почему это не компилируется:

let fullData = [["availabilities": [], "firstSlot": Date()]] as [AnyObject]

let slots = fullData.map { (s) -> [AnyObject] in
    return (s as Dictionary)["availabilities"] as [AnyObject]
}

Тип коллекции - [AnyObject], поэтому карта должна иметь возможность сделать вывод, что «s» - это AnyObject. Затем выполняется явное приведение результата к [AnyObject], поэтому карта должна понимать, что возвращается [AnyObject], а результирующая коллекция [[AnyObject]]]

Что мне не хватает?

1 Ответ

2 голосов
/ 10 июля 2020

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

Вы не можете «сбоку» привести AnyObject к Dictionary (или к чему-либо еще в этом отношении). Вы должны принудительно применить его, используя as!

Плюс, в Swift нет такой вещи, как простой и простой словарь, потому что это общий c. Самый общий тип словаря - [AnyHashable:Any].

Таким образом, начальное преобразование s должно быть:

(s as! [AnyHashable:Any])

И по тому же признаку вы не можете «сбоку» отбрасывать результирующее значение взято из словаря; вы должны принудительно использовать его:

as! [AnyObject]

Теперь вы можете записать всю строку как:

return (s as! [AnyHashable:Any])["availabilities"] as! [AnyObject]

Конечно, то, что вы здесь делаете, кажется совершенно безумным; вы не должны ничего превращать в AnyObject. Но, возможно, это игрушечный пример, взятый из другого контекста, например, у вас есть JSON? Но в случае этого вы должны использовать Codable для организации JSON в реальные объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...