Pull to refresh

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

Reading time2 min
Views6.4K
image

Вы наверняка использовали 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.
Tags:
Hubs:
Total votes 11: ↑5 and ↓6-1
Comments10

Articles