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
.
的初始化器
请将问题读到底,因为它似乎与许多类似的问题重复,但事实并非如此。大多数其他问题使用带有 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
.