9

请把问题读到最后,因为它似乎与许多类似的问题重复,但事实并非如此。大多数其他问题使用带let关键字的闭包在对象初始化之前捕获弱或无主的自我。我不。

我的代码:

class Singleton : ObserverProtocol {

    static let shared = Singleton()

    private let obs : Observer = Observer.init()

    private init() { self.obs.responder = self }

    func observe(_ object : Any) {}

    fileprivate class Observer : NSObject {
        unowned var responder : ObserverProtocol!
        func observe(_ obj : Any) {
            self.responder.observe(obj)
        }
    }
}

fileprivate protocol ObserverProtocol : class {
    func observe(_ object : Any)
}

当我尝试编译时,我得到一个突出显示的错误unowned var responder : ObserverProtocol!

'unowned' 只能应用于类和类绑定协议类型,而不是 'ObserverProtocol!'

如果我更改unownedweak我可以编译。

显然有一些unowned我不明白的概念,所以如果有人可以向我解释,我将不胜感激。

PS我知道类似这样的多个问题:

UIView, CMDeviceMotionHandler : unowned 只能应用于类和类绑定协议类型

但我想这不是我的情况。

4

1 回答 1

16

如您所知,unowned不能是可选的,但weak可能nil在某个时候。

据我了解,unowned变量与隐式展开选项不同。隐式展开是针对变量的,它可能是nil,但我们已经知道这个变量不在 nil确切的访问点。但是,unowned变量永远不会nil在任何时候出现。

因此,您不能使用unowned常量类型ObserverProtocol!。你需要摆脱!.

但如果你确实摆脱了!,则Observer需要一个初始化responder.

于 2017-08-29T14:28:32.460 回答