Parent не является объектом, который распознает Firebase, поэтому выдает ошибку.
Руководство по Firebase Чтение и запись данных показывает четыре типа объектов, которые могут быть записаны; Строка, число, словарь, массив.
Одним из решений является встраивание в класс функции, которая возвращает данные, которые вы хотите записать.
public class Parent {
var phoneNumber: String?
var familyKey: String?
var geofences: [GeofenceData]?
init() {
self.phoneNumber = ""
self.familyKey = ""
self.geofences = nil
}
//other init functions
func getParentDict() -> [String: Any] {
let geoDict = ["name": name,
"latitude": latitude,
"longitude": longitude,
"radius": radius
]
let zeroNode = ["0": geoDict]
let dictForFirebase: [String: Any] = [
"phoneNumber": phoneNumber,
"familyKey": familyKey,
"geofences": zeroNode
]
return dictForFirebase
}
}
и на практике
var tempGeofences = [GeofenceData]()
tempGeofences.append(GeofenceData(name: "Hello WOrld", latitude: 0, longitude: 0, radius: 1000))
let familyKey:String = String(Int.random(in: 1000...99999))
let uid:String = Auth.auth().currentUser!.uid
let phoneNumber = "1111111111"
let parent = Parent(phoneNumber: phoneNumber, familyKey: familyKey, geofences: tempGeofences)
let parentDict = parent.getParentDict
databaseRef.child(uid).setValue(parentDict)
Однако одной проблемой является дочерний узел с ключом «0». Похоже, вы можете использовать массив. Если есть хорошая причина, это хорошо, но обычно есть гораздо лучшие альтернативы использованию массивов в базах данных NoSQL. См. Старый, но все еще точный пост Firebase под названием Массивы злы
EDIT:
За комментарий / вопрос 'как добавить еще один дочерний узел после узла "0" *
Предположим, что мы знаем родительский узел, qSaEE ..., давайте добавим узел "1"
let parentNode = "qSaEE..."
let geofenceRef = firebaseRef.child(parentNode).child("geofences")
let geoDict = ["name": name,
"latitude": latitude,
"longitude": longitude,
"radius": radius
]
let oneNode = ["1": geoDict]
geofenceNode.setValue(oneNode)