首页 > 解决方案 > 如何在 RxSwift 中为 HasDelegate 协议编写 getter 和 setter?

问题描述

我正在HasDelegateIWDeviceManager.

在我读过的所有帖子中,没有人为此public var delegate属性编写 getter 和 setter。

编译器明确要求我为public var delegate. 为什么在我的情况下需要它?

我尝试编写,但是当我尝试获取或设置委托时我的代码崩溃了。

我该如何解决这个问题?

我已经分享了下面的代码

extension IWDeviceManager: HasDelegate {

    public typealias Delegate = IWDeviceManagerDelegate

    // Compiler explicitly asks to write getter and setter for this.
    public var delegate: IWDeviceManagerDelegate? { 
        get { // Crashes here
            return IWDeviceManager.shared()?.delegate 
        } 
        set(newValue) { // crashes here
            IWDeviceManager.shared()?.delegate = newValue 
        } 
    }
}

下面是 IWDeviceManager 的接口

open class IWDeviceManager : NSObject {

    weak open var delegate: IWDeviceManagerDelegate!

    open class func shared() -> Self!

    open func initMgr()

    open func initMgr(with config: IWDeviceManagerConfig!)

}

标签: rx-swiftrx-cocoa

解决方案


而不是使用HasDelegate试试这个:

class IWDeviceManagerDelegateProxy
    : DelegateProxy<IWDeviceManager, IWDeviceManagerDelegate>
    , DelegateProxyType
    , IWDeviceManagerDelegate {

    init(parentObject: IWDeviceManager) {
        super.init(parentObject: parentObject, delegateProxy: IWDeviceManagerDelegateProxy.self)
    }

    static func currentDelegate(for object: IWDeviceManager) -> Delegate? {
        return object.delegate
    }

    static func setCurrentDelegate(_ delegate: IWDeviceManagerDelegate?, to object: IWDeviceManager) {
        object.delegate = delegate
    }

    static func registerKnownImplementations() {
        self.register { IWDeviceManagerDelegateProxy(parentObject: $0) }
    }
}

推荐阅读