Swift. unowned может применяться только к классу и типу протокола, привязанного к классу. слабый работает отлично

Пожалуйста, прочитайте вопрос до конца, так как он кажется дубликатом многих похожих других, но это не так. Большинство других вопросов используют замыкания с let Ключевое слово для захвата слабого или неизвестного себя перед объектом init. Я не буду.

Мой код:

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 что я не понимаю, поэтому я был бы признателен, если бы кто-то мог мне это объяснить.

PS Мне известно несколько вопросов, подобных этому:

UIView, CMDeviceMotionHandler: unowned может применяться только к классам и типам протоколов, связанных с классом

Но я полагаю, это не мой случай.

1 ответ

Решение

Как ты уже знаешь, unowned не может быть необязательным, но weak может быть nil в какой-то момент.

Из того, что я понимаю, unowned Переменная отличается от неявно развертываемых опций. Неявное развертывание для переменных, которые могут быть nil, но мы уже знаем, что эта переменная не nil в точной точке доступа. Тем не мение, unowned переменная никогда не может быть nil в любой точке.

Таким образом, вы не можете использовать unowned константа типа ObserverProtocol!, Вы должны избавиться от !,

Но если вы избавитесь от !, Observer нужен инициализатор, который инициализирует responder,

Другие вопросы по тегам