Приветствую. Требуется помощь более опытного зала
Дано:
-
Есть модели данных, которые очень между собой похожи, для обработки данных от Firestore.
Например юзер и задача. Естественно отличаются параметрами:class MainUser: SomeProtocol { let uid: String var email: String ... var dictionary: [String: Any ] { return ["uid": uid, "email": email ...] } init (uid: String, email: String ...) { self.uid = uid self.email = email } convenience init ?(dictionary: [String: Any]) { var uid: String var email: String if let uidInit = dictionary["uid"] as ? String {uid = uidInit} else {uid = ""} if let emailInit = dictionary["email"] as ? String {email = emailInit} else {email = ""} self.init(uid: uid, email: email) } } class Task: SomeProtocol { let uid: String var title: String ... var dictionary: [String: Any ] { return ["uid": uid, "title": title ...] } init (uid: String, title: String ...) { self.uid = uid self.title = title ... } convenience init ?(dictionary: [String: Any]) { var uid: String var title: String ... if let uidInit = dictionary["uid"] as ? String {uid = uidInit} else {uid = ""} if let emailInit = dictionary["email"] as ? String {email = emailInit} else {email = ""} ... self .init(uid: uid, email: email...) } }
Протокол с чем-нибудь )))
protocol SomeProtocol {
var dictionary: [String: Any ] { get }
}
-
Есть типовые запросы к БД по чтению и созданию документов, например юзера:
func getUserDoc(collection: CollectionReference, document: String, completion: @escaping(MainUser?, Error?)->Void) { var user: MainUser? collection.document(document).getDocument { (snapshot, error) in if let snapshot = snapshot { user = MainUser(dictionary: snapshot.data() ?? [:]) } completion(user, error) } }
При таких одинаковых запросах, хотелось бы исопльзовать дженерик вроде:
func getDoc<T: SomeProtocol>(collection: CollectionReference, document: String, completion: @escaping(T?, Error?)->Void) {
var tempData: T?
collection.document(document).getDocument { (snapshot, error) in
if let snapshot = snapshot {
user = T(dictionary: snapshot.data() ?? [:]) // Вот здесь проблема
}
completion(tempData, error)
}
}
Но естетсвенно компилятор ругается, тк инициализаторы по словарю разные в моделях (а они всегда разные, тк полный набор параментров разный). Как это можно победить именно в рамках использования дженерика?