Вы наверняка использовали Storyboard или XIB для верстки интерфейсов? Верстать из кода это прекрасно, но иногда намного проще понять как устроен какой-то из компонентов интерфейса, увидев его, а не прочитав. В этой записи я хочу обсудить необходимость использования для IBOutlet модификатора private.
Так вот представим, что вы привычно собираетесь создать 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
ссылка на оригинал статьи https://habr.com/post/424843/
Добавить комментарий