Swift。 unowned 只能应用于 class 和 class 绑定的协议类型。弱工作正常

Swift. unowned may only be applied to class and class-bound protocol types. weak works fine

请将问题读到底,因为它似乎与许多类似的问题重复,但事实并非如此。大多数其他问题使用带有 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' may only be applied to class and class-bound protocol types, not 'ObserverProtocol!'

如果我将 unowned 更改为 weak 我可以编译。

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

P.S。我知道有多个与此类似的问题:

但我想这不是我的情况。

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

据我了解,unowned 变量不同于隐式解包选项。隐式解包是针对变量的,可能是nil,但是我们已经知道这个变量在确切的访问点是不是nil。但是,unowned 变量在任何时候都不可能是 nil

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

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

的初始化器