ios - 泛型获取 Firestore 集合

标签 ios swift firebase generics swift5

我正在尝试创建一个通用函数来获取不同的集合,并根据给定的类型,假设 T 将所有文档转换为 T,然后填充和返回一个数组。

问题是,在这一行 let item: T = T.init(document: document) 我收到一条错误消息 Type 'T' has no member 'init' code> 即使没有 .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)

原始答案

在您的上下文中,T 根本不受任何类型的限制,因此它不会识别您的初始值设定项。

我会将方法签名更改为:

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/

相关文章:

ios - 使用 iOS 中的通用链接将数据从 App 传回 Safari 网页

java - 如何在 'old' Core Data中实现保存完成?

ios - segue后返回原始 View

node.js - Firebase 的云功能 : how to issue a request to my Cloud Endpoint

ios - 将 JSON 响应本地保存在数据库 Objective C 中

iOS - 无法从 switch 语句跳转到此 case 标签?

ios - 如何将 iOS 应用程序转换到更多国家/地区的商店

ios - 自定义 UITableViewHeaderFooterView 标签被截断

android - react native Android Firebase Crashlytics : Must Initialize Fabric before Using singleton()

javascript - 使用 Node.js 和 Firebase/Firestore 创建 Web 应用程序