Пожалуйста, прочитайте вопрос до конца, так как он кажется дубликатом многих других, но это не так.  В большинстве других вопросов используются замыкания с ключевым словом 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