Например, при попытке доступа к String
на первом уровне словаря компилятор ожидает объект типа [String: [String: Any]]
.
Действительно, потому что при записи dictionary: [String: [String: [String: Any]]
, вы дали гарантию компилятору, что значения dictionary
равны [String: [String: Any]]
.
Если вы хотите, чтобы ваш словарь мог содержать много разных типов во время выполнения, вам нужно дать его тип stati c, который является супертипом (протокол или суперкласс) всех типов, которые вы хотите использовать. Есть два способа использования таких значений:
- Вы делаете протокол или суперкласс содержа функции (и свойства, индексы и т. Д. c). что вы хотите использовать. Вы можете вызывать эти функции для значений без необходимости знать конкретные типы значений. Компилятор знает, что все значения в dict будут поддерживать эти функции (благодаря тому, что он является подклассом класса или соответствует протоколу).
- Понижение значений (например, вы знаете, что значение для ключ
"age"
всегда будет Int
) во время выполнения, в более конкретный тип c, который делает то, что вы хотите.
Самый общий, универсально применимый тип - Any
, Но его общность заключается в том, что у него нет никаких требований, так что вы действительно ничего не можете сделать с Any
, кроме как обойти его, и, в конечном счете, придется понизить его, чтобы что-то с ним сделать.
TL; DR : Вы должны использовать Any
, или, возможно, какой-нибудь другой общий тип протокола или суперкласс
Еще лучше, есть куча библиотек для добавления функциональности Codable в Firebase. Я предлагаю вам использовать один из них.