Почему Swift запрещает слабую ссылку для не необязательного типа? - PullRequest
0 голосов
/ 08 сентября 2018

Это не чисто любопытство, есть ощущение, что я могу неправильно понять что-то о слабых ссылках в Swift.

Предположим, я создал класс из View Controller и передал его ссылку инициализатору:

class = MyClass(vc: self)

Поскольку раскадровка и окно уже содержат ссылку на этот View Controller, логично, что MyClass имеет слабую ссылку на него (по той же причине все ссылки, созданные в IB, по умолчанию являются слабыми):

class MyClass: NSObject {
    private weak var viewController: UIViewController

    init(vc: UIViewController) {
       self.viewController = vc
       super.init
    }

    func setViewController(_ vc: UIViewController) {
       self.viewController = vc
    }

    ...
}

Однако этот код выдает ошибку компиляции, поскольку переменная viewController не является обязательной. Поэтому я должен был добавить '!' чтобы просмотреть объявление контроллера и удалить инициализатор, оставив только setViewController, что выглядит довольно неестественно.

В чем причина запрета необязательных слабых данных?

1 Ответ

0 голосов
/ 08 сентября 2018

Само определение переменной weak состоит в том, что переменная не увеличивает счетчик ссылок на объект и, что более важно для вашего вопроса, значение переменной будет автоматически установлено на nil, когда объект, на который ссылаются, будет освобожден.

Поскольку переменная должна учитывать значение nil, она должна быть необязательной.Вот почему необязательные слабые переменные запрещены.

Не объявляйте viewController неявно развернутым (используя !).Сделайте его необязательным (используя ?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...