迅速.unowned只能应用于类和类绑定协议类型.弱者工作得很好

iur*_*iur 8 swift swift-protocols unowned-references

请将问题读到最后,因为它似乎是许多类似其他人的副本,但事实并非如此.大多数其他问题使用带let关键字的闭包来捕获对象init之前的弱或无主自我.我不.

我的代码:

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)
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我会突出显示错误 unowned var responder : ObserverProtocol!

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

如果我unowned改为weak我可以编译.

显然有一些unowned我不理解的概念,所以如果有人能向我解释,我将不胜感激.

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

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

但我想这不是我的情况.

sCh*_*Cha 15

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

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

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

但是如果你真的摆脱了!,Observer需要一个初始化的初始化器responder.

  • 是.我完全忘记了这段经文.一个无主的参考期望总是有价值.因此,ARC从未将无主引用的值设置为nil,这意味着使用非可选类型定义无主引用. (2认同)