Что если я хочу присвоить свойство себе?
Если я попытаюсь запустить следующий код:
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
быть названным?