请仔细阅读该问题,因为它似乎是许多其他类似问题的重复,但事实并非如此。其他大多数问题都使用带有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更改为weak,则可以编译。

显然有一些我不了解的有关unowned的概念,因此,如果有人可以向我解释它,我将不胜感激。

附言我知道有多个与此类似的问题:

UIView, CMDeviceMotionHandler : unowned may only be applied to class and class-bound protocol types

但是我想这不是我的情况。

最佳答案

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

据我了解,unowned变量不同于隐式展开的可选变量。隐式解包是针对变量的,可能是nil,但是我们已经知道在访问的确切位置,此变量是而不是 nil。但是,unowned变量在任何时候都不能是nil

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

但是,如果您确实摆脱了!,则Observer需要一个用于初始化responder的初始化程序。

07-24 09:51