请仔细阅读该问题,因为它似乎是许多其他类似问题的重复,但事实并非如此。其他大多数问题都使用带有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
的初始化程序。