我正在使用 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
属性中拥有一些通用的东西,而且在 ReferenceWritableKeyPath
的 Root
中也有一些通用的东西。我怎样才能做到这一点?我尝试在类上使用泛型,但它不允许我对泛型属性进行弱引用。
最佳答案
通过将 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/