【发布时间】:2020-03-07 04:11:01
【问题描述】:
我正在尝试创建一个通用函数来获取不同的集合,并根据给定类型假设 T 将所有文档转换为 T,然后填充并返回一个数组。
问题是,在这一行 let item: T = T.init(document: document) 我得到一个错误说 Type 'T' has no member 'init' 即使没有 .init 它也会失败。
这是一个将传递给此泛型函数的类型示例。
struct Package: Identifiable {
var id = UUID()
let documentReference: DocumentReference
init(document: DocumentSnapshot) {
self.documentReference = document.reference
}
这是我的代码:
static func fetchCollection<T>(collection: String, completion: @escaping ([T]) -> Void) {
var array: [T] = []
db.collection(collection).getDocuments() { (querySnapshot, err) in
if let snapshot = querySnapshot {
guard let userID = Auth.auth().currentUser?.uid else { return }
for document in snapshot.documents {
let item: T = T.init(document: document)
array.append(item)
}
completion(array)
}
}
}
函数调用:
FirebaseViewModel.fetchCollection<Package>(collection: "packages") { packages in
self.userData.packages = packages
}
【问题讨论】:
-
我看到你不会在任何地方使用你的结构吗?
-
正确。当我将函数调用为
Package类型时,我正在考虑使用它 -
你能用函数调用进行编辑吗?我认为你应该
fetchCollection<T:Package>。将 T 声明为 Package。
标签: ios swift firebase generics swift5