Pull to refresh

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

Reading time 2 min
Views 6.3K
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.7% @IBOutlet private weak var someLabel: UILabel! 56
6.96% @IBOutlet weak private var someLabel: UILabel! 8
13.91% @IBOutlet private weak var someLabel: UILabel? 16
0.87% @IBOutlet weak private var someLabel: UILabel? 1
4.35% @IBOutlet private var someLabel: UILabel? 5
10.43% @IBOutlet private var someLabel: UILabel! 12
14.78% никаких IBOutlet, интерфейс 100% задается из кода 17
115 users voted. 42 users abstained.
Tags:
Hubs:
-1
Comments 10
Comments Comments 10

Articles