ios - 如何使我的 ReferenceWritableKeyPath 类通用

标签 ios swift generics

我正在使用 ReferenceWritableKeyPath 修改模型类中的属性。这工作得很好,但是,我现在想让我的代码更通用一些,以便我可以修改不同类的属性。

这是我当前的代码:

final class MyListener {
    private let reference: String
    private var listener: DatabaseHandle?
    private let backendClient: BackendClient
    private weak var model: MyModel?

    func listenToAndUpdate<T>(_ property: ReferenceWritableKeyPath<MyModel, T?>) {
        guard listener == nil else {
            return
        }
        listener = backendClient.listenToRtdbProperty(reference) { [weak self] (result: Result<T, RequestError>) in
            switch result {
            case .success(let value):
                self?.model?[keyPath: property] = value
            case .failure:
                self?.model?[keyPath: property] = nil
            }
        }
    }
}

我本质上需要在 model 属性中拥有一些通用的东西,而且在 ReferenceWritableKeyPathRoot 中也有一些通用的东西。我怎样才能做到这一点?我尝试在类上使用泛型,但它不允许我对泛型属性进行弱引用。

最佳答案

通过将 MyListener 类设为泛型,您的做法是正确的,但您还需要对泛型类型施加类型约束,以确保它只能是一个类,该类可以有一个弱引用。所有类都符合 AnyObject,因此它对于您的情况来说是足够的类型约束。

final class MyListener<Model: AnyObject> {
    private let reference: String
    private var listener: DatabaseHandle?
    private let backendClient: BackendClient
    private weak var model: Model?

    func listenToAndUpdate<T>(_ property: ReferenceWritableKeyPath<Model, T?>) {
        guard listener == nil else {
            return
        }
        listener = backendClient.listenToRtdbProperty(reference) { [weak self] (result: Result<T, RequestError>) in
            switch result {
            case .success(let value):
                self?.model?[keyPath: property] = value
            case .failure:
                self?.model?[keyPath: property] = nil
            }
        }
    }
}

关于ios - 如何使我的 ReferenceWritableKeyPath 类通用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57256213/

相关文章:

ios - Firebase 崩溃分析 | Swift 包管理器 (SPM) 运行脚本?

ios - 在 swift 2.3 中编写应用程序是否为时已晚?

java - 具有通用返回类型的命令模式

android - AdMob:过滤 child 广告

android - 如何以 3D 模式查看 Google map ?

ios - iOS 应用中的形状

swift - 无法构建或存档运行良好的 Xcode 项目

ios - 在 Swift 中以编程方式完全杀死 ViewController

swift - 我怎样才能编写一个函数,假设它是一个可选类型,那么它会在 swift 中解开通用属性?

c# - 实现一个接口(interface),泛型基于该接口(interface)