А в ваших iOS приложениях IBOutlet уже private?

image

Вы наверняка использовали 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/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *