Пожалуйста, прочитайте вопрос до конца, так как он кажется дубликатом многих других, но это не так. В большинстве других вопросов используются замыкания с ключевым словом 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' может применяться только к классам и типам протоколов, привязанным к классу, а не 'ObserverProtocol!'
Если я изменю unowned
на weak
, я смогу скомпилировать.
Ясно, что в unowned
есть какая-то концепция, которую я не понимаю, поэтому я был бы признателен, если бы кто-нибудь объяснил мне ее.
P.S. Я знаю несколько вопросов, подобных этому:
Но я предполагаю, что это не мой случай.
An unowned reference is expected to always have a value. As a result, ARC never sets an unowned reference’s value to nil, which means that unowned references are defined using nonoptional types.
29.08.2017