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 Мне известно несколько вопросов, подобных этому:
Но я полагаю, это не мой случай.
1 ответ
Как ты уже знаешь, unowned
не может быть необязательным, но weak
может быть nil
в какой-то момент.
Из того, что я понимаю, unowned
Переменная отличается от неявно развертываемых опций. Неявное развертывание для переменных, которые могут быть nil
, но мы уже знаем, что эта переменная не nil
в точной точке доступа. Тем не мение, unowned
переменная никогда не может быть nil
в любой точке.
Таким образом, вы не можете использовать unowned
константа типа ObserverProtocol!
, Вы должны избавиться от !
,
Но если вы избавитесь от !
, Observer
нужен инициализатор, который инициализирует responder
,