Как стать автором
Обновить

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

Время на прочтение2 мин
Количество просмотров6.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 в комментарии.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
А как вы в общем случае предпочитаете задавать 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 пользователей. Воздержались 43 пользователя.
Теги:
Хабы:
Всего голосов 11: ↑5 и ↓6-1
Комментарии10

Публикации

Ближайшие события