Что если я хочу присвоить свойство себе?

Если я попытаюсь запустить следующий код:

photographer = photographer

Я получаю ошибку:

Назначение собственности для себя.

Я хочу присвоить свойство себе, чтобы заставитьphotographer didSet блок для запуска.

Вот реальный пример: в лекции «16. Сегу и текстовые поля»Зимний 2013 Стэнфордский курс iOS (13:20), профессор рекомендует написать код, подобный следующему:

@IBOutlet weak var photographerLabel: UILabel!

var photographer: Photographer? {
    didSet {
        self.title = photographer.name
        if isViewLoaded() { reload() }
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    reload()
}

func reload() {
    photographerLabel.text = photographer.name
}

Заметка: Я внес следующие изменения: (1) код был переключен с Objective-C на Swift; (2) потому что это в Swift, я используюdidSet блок собственности вместоsetPhotographer: Способ; (3) вместоself.view.window я используюisViewLoaded потому что первый ошибочно заставляет вид загружаться при доступеview имущество; (4)reload() метод (только) обновляет метку в целях простоты и потому, что она больше похожа на мой код; (5) фотографIBOutlet добавлена ​​метка для поддержки этого более простого кода; (6), так как я использую Swift,isViewLoaded() проверка больше не существует просто по соображениям производительности, теперь онатребуется чтобы предотвратить сбой, так как IBOutlet определяется какUILabel! и неUILabel? поэтому попытка доступа к нему до загрузки представления приведет к сбою приложения; это не было обязательным в Objective-C, поскольку он использует шаблон нулевого объекта.

Причина, по которой мы дважды вызываем reload, заключается в том, что мы не знаем, будет ли свойство установлено до или после создания представления. Например, пользователь может сначала установить свойство, затем представить контроллер представления, или они могут представить контроллер представления, а затем обновить свойство.

Мне нравится, как это свойство не зависит от того, когда загружается представление (лучше не делать никаких предположений о времени загрузки представления), поэтому я хочу использовать этот же шаблон (только слегка измененный) в моем собственном коде:

@IBOutlet weak var photographerLabel: UILabel?

var photographer: Photographer? {
    didSet {
        photographerLabel?.text = photographer.name
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    photographer = photographer
}

Здесь вместо того, чтобы создавать новый метод для вызова из двух мест, я просто хочу код вdidSet блок. я хочуviewDidLoad заставитьdidSet чтобы быть вызванным, поэтому я присваиваю свойство себе. Свифт не позволяет мне делать это, хотя. Как я могу заставитьdidSet быть названным?

Ответы на вопрос(0)

Ваш ответ на вопрос