А в ваших 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 не будет опубликован. Обязательные поля помечены *