gpt4 book ai didi

ios - 泛型获取 Firestore 集合

转载 作者:行者123 更新时间:2023-12-01 16:06:36 25 4
gpt4 key购买 nike

我正在尝试创建一个通用函数来获取不同的集合,并基于给定类型假设 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
}

最佳答案

编辑
顶级方法签名上的泛型不能被限制为结构,因此需要协议(protocol)抽象。
创建 PackageProtocol

protocol PackageProtocol {
init(document: DocumentSnapshot)
}
符合 PackagePackageProtocol struct Package: PackageProtocol 将您的方法签名更改为: static func fetchCollection<T: PackageProtocol>(collection: String, completion: @escaping ([T]) -> Void)原始答案
在您的上下文中 电话 完全不受任何类型的限制,因此它不会识别您的初始化程序。
我会将方法签名更改为: static func fetchCollection<T == Package >(collection: String, completion: @escaping ([T]) -> Void)或者如果您期望不同类型的 Package static func fetchCollection<T: Package >(collection: String, completion: @escaping ([T]) -> Void)

关于ios - 泛型获取 Firestore 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58801932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com