Вы наверняка использовали Storyboard или XIB для верстки интерфейсов? Верстать из кода это прекрасно, но иногда намного проще понять как устроен какой-то из компонентов интерфейса, увидев его, а не прочитав. В этой записи я хочу обсудить необходимость использования для IBOutlet модификатора private.
Разработчиков, для которых инкапсуляция IBOutlet является очевидной, тут вряд ли что-то удивит, зато может быть интересен опрос в конце статьи.
Представим, что вы собираетесь создать IBOutlet (ссылку на View с Storyboard) для какого-нибудь из ваших UILabel. При перетаскивании мышкой Xcode заботливо создаст нам что-то вроде
@IBOutlet weak var myLabel: UILabel!
Я долгое время считал эту конструкцию оптимальной, до того момента как мой коллега не спросил — а почему твои IBOutlet не private?
В самом деле, зачем мне оставлять все IBOutlet-ы доступными извне?
Представим себе классическую задачу — у нас есть ячейка, в которой отображается, к примеру, чей-то контакт
import UIKit
class ContactCell: UITableViewCell {
@IBOutlet private weak var nameLabel: UILabel!
@IBOutlet private weak var positionLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
}
func setupCell(withContact contact: Contact) {
nameLabel.text = contact.name
positionLabel.text = contact.position
}
}
С помощью добавления private к привычным нам IBOutlet можно гарантировать, что указанные поля ячейки не будет заданы из другого класса. Особенно это может быть полезно при командной работе, когда кто-то по неосторожности / нехватке времени / глупости (нужное подчеркнуть) попробует задать цвета, текст или какие-то другие свойства у Label-ов ячейки прямо в методе tableView(_:cellForRowAt:).
А представьте, что ячейка или целый ViewController содержит множество IBOutlet-ов, что настроек отображения масса. Не проще ли обезопасить себя добавлением private, чем потом искать почему внешний вид элемента вдруг изменился или откуда-то появился Gesture Recognizer, который задает неожиданное поведение?
P.S.: Если после прочтения вам захочется использовать private для IBOutlet-ов, то для простоты можно завести для этого снипет в Xcode.
Ниже приведен опрос, если вы захотите прокомментировать свой вариант ответа, welcome в комментарии.
Only registered users can participate in poll. Log in, please.
А как вы в общем случае предпочитаете задавать IBOutlet?
48.28% @IBOutlet private weak var someLabel: UILabel!56
6.9% @IBOutlet weak private var someLabel: UILabel!8
13.79% @IBOutlet private weak var someLabel: UILabel?16
0.86% @IBOutlet weak private var someLabel: UILabel?1
4.31% @IBOutlet private var someLabel: UILabel?5
10.34% @IBOutlet private var someLabel: UILabel!12
15.52% никаких IBOutlet, интерфейс 100% задается из кода18
116 users voted. 42 users abstained.