我正在创建一个通用函数来处理Firebase快照,并且发现该通用函数不知道要使用哪种类型,除非您通过在参数中输入它来明确告知该类型。
因此,我采用了一种非常丑陋的方法,即仅创建一个空白,例如User()并将其输入到此函数中,然后再也不要触摸它。
有什么更好的方法?
func handleSnapshot<T: FirebaseType>(snapshot: FDataSnapshot?, forType type: T) -> [T]? {
guard let snapshot = snapshot, dictionaries = snapshot.value as? [NSObject: AnyObject] else { return nil }
var objects = [T]()
for (uid, dictionary) in dictionaries {
let theUID = uid as? String ?? "No UID"
guard let dictionary = dictionary as? [NSObject: AnyObject] else { return nil }
let object = T(fromDictionary: dictionary, andUID: theUID)
objects.append(object)
}
return objects
}
传递类型对象而不是类型的实例。另外,andUID:
是不好的风格。
func handleSnapshot<T: FirebaseType>(snapshot: FDataSnapshot?, forType type: T.Type) -> [T]? {
guard let snapshot = snapshot, dictionaries = snapshot.value as? [NSObject: AnyObject] else { return nil }
var objects = [T]()
for (uid, dictionary) in dictionaries {
let theUID = uid as? String ?? "No UID"
guard let dictionary = dictionary as? [NSObject: AnyObject] else { return nil }
if let object = T(fromDictionary: dictionary, uid: theUID) {
objects.append(object)
}
}
return objects
}
使用:
// Explicit type declaration is unnecessary but included for clarity.
let doodads: [Doodad]? = handleSnapshot(snapshot, forType: Doodad.self)
另一种方法:将方法添加到FirebaseType
协议扩展中:
extension FirebaseType {
func arrayFromSnapshot(snapshot: FDataSnapshot?) -> [Self]? {
guard let snapshot = snapshot, dictionaries = snapshot.value as? [NSObject: AnyObject] else { return nil }
var objects = [Self]()
for (uid, dictionary) in dictionaries {
let theUID = uid as? String ?? "No UID"
guard let dictionary = dictionary as? [NSObject: AnyObject] else { return nil }
if let object = Self(fromDictionary: dictionary, uid: theUID) {
objects.append(object)
}
}
return objects
}
}
使用:
let doodads = Doodad.arrayFromSnapshot(snapshot)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句