Для классов нового стиля используйте type(self)
, чтобы получить «текущий» класс:
def create_another(self):
return type(self)()
Вы также можете использовать self.__class__
, как это будет использовать значение type()
, но использование метода API всегда рекомендуется.
Для классов старого стиля (python 2, не наследующих от object
), type()
не так полезен, поэтому вы вынуждены использовать self.__class__
:
def create_another(self):
return self.__class__()
Родитель не является объектом, который распознает 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 под названием Arrays Are Evil
РЕДАКТИРОВАТЬ:
За комментарий / вопрос «Как добавить еще один дочерний узел после узла "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)