У вас есть:
print(snapshot.value)
if let dict = snapshot.value as? Dictionary<String, Any>{
print("VALUES!!!")
....
}
Вы говорите, что print(snapshot.value)
называется, но не print("VALUES!!!")
.Ну, это означает, что snapshot.value
или это не Dictionary
, ключи которого String
, объекты и значения имеют тип Any
.
Теперь давайте посмотрим на вывод snapshot.value
:
Optional(<__NSArrayM 0x600002fdaa60> ...
NSArrayM
=> NSMutableArray
, поэтому snapshot.value
является Array
, а не Dictionary
.Конечно, тогда as? Dictionary
потерпит неудачу!
Так что вам нужно рассматривать его как Array
.
Быстро написано:
if let array = snapshot.value as? [[String: Any]] {
for aValue in array {
let name = aValue["name"] as? String ?? "unnamed"
let photoName = aValue["photo"] as? String ?? "noPhoto"
let rating = aValue["rating"] as? Int ?? 0
let steps = aValue["steps"] as? [String] ?? []
let ingredients = aValue["ingredients"] as? [[String: String]] ?? [:]
let meal = Meal(name: name, photo: UIImage(named: photoName), rating: rating, steps: steps, ingredients: ingredients)
self.meals.append(meal)
}
}
То, что также могло бытьнеправильно с вашим подходом:
var downloadedName : String!
loop {
if let name = values["name"] as? String {
downloadedName = name
}
let meal = Meal(name: downloadedName, ...)
}
Что ж, если для второго значения у вас нет имени (либо потому, что это не String
, либо потому, что значение не существует), вы downloadedName
будет иметь значение первого, но остальные значения второго.
Я использовал подход:
let name = aValue["name"] as? String ?? "unnamed"
То есть, если он равен нулю, он получаетзначение по умолчанию.Но вы можете принять только один действительный, с помощью guard let
или if let
потенциально для всех подзначений.
Например:
if let name = aValue["name"] as? String,
let let photoName = aValue["photo"] as? String,
... {
let meal = Meal(name: name, photo: UIImage(named: photoName)
self.meals.append(meal)
}
А так как ваш Meal.init()
кажетсячтобы вернуть необязательный параметр, вы можете добавить его также в if let
и избежать принудительного развертывания meal
.