2015-02-15 3 views
1

Предположим, я создаю собственный подкласс UIViewController под названием ViewController.Должны ли свойства subview UIViewController быть неявно развернутыми опциями?

Я хочу программно добавить к нему свойство var textField: UITextField!.

Должен ли я сделать textField неявно развернутым необязательным и инициализировать его в viewDidLoad?

+0

Я согласен с drewag. Даже если код будет в конечном итоге завален «?» символы :) – Woodstock

+0

@Woodstock [drewag сказал, чтобы использовать non-optionals] (http://stackoverflow.com/a/28530848/242933), которые не требуют '?' символы. – ma11hew28

ответ

0

Нет, избегайте неявно разворачиваемых опций по возможности. Единственный раз, когда вы должны использовать неявно развернутые опции, - это когда их инициализация не может произойти во время инициализации вашего контроллера представлений. Это часто встречается, когда:

  1. Они выходы вы присоединительные в файле СИБ/раскадровке
  2. Они зависят от какого-либо другого объекта, который грузил из СИБА/раскадровки

При использовании неявно развернутые опционы, вы теряете определенные меры защиты, которые добавил Swift. Самое главное, вы потеряете компилятор, заставляющий вас инициализировать свойство до его использования.

+0

Я только что ответил после ссылки на ваш пост [здесь] (http://www.drewag.me/posts/uses-for-implicitly-unwrapped-optionals-in-swift)! Мне кажется, что вы говорите «да», но, видимо, не для программно построенных viewControllers? – kellanburket

+0

@blacksquare, нет, я говорю «нет», кроме как в узких обстоятельствах выше. В большинстве случаев инициализация программного подзапроса не будет зависеть от IBOutlet. Он может быть инициализирован во время инициализации контроллера представления, а затем присоединен к иерархии представлений в viewDidLoad без необходимости сделать его неявно развернутым необязательным. – drewag

+0

Несомненно, я получаю это, но затем вы повторяете инициализацию для каждого инициализатора, который использует ваш viewController, если вы не хотите использовать неявно развернутые опции. Это звучит не идеально, не так ли? Лучшей практикой, вероятно, является просто использование опционных, тогда нет? – kellanburket

0
  1. Вы должны инициализировать его в loadView, а не viewDidLoad:.
  2. Вы можете использовать lazy переменные, чтобы избежать УСТРОЙСТВ для подвидов, в то время как эффективно отложив инициализацию loadView, или когда свойство обращаться до loadView называются, что приводит нас к:
  3. Я считаю, неявно распакованное УСТРОЙСТВО (и вынуждены разворачивать) быть кодовым запахом во всех случаях. Это полностью можно получить доступ к одному из них до loadView, поэтому они должны быть истинными опциями. Тип и нуль-безопасность - Важные.

Объявите ленивую переменный так:

private(set) lazy var imageView = UIImageView(...) 

В качестве простого задания для точки три:

let imageViewController = ImageViewController() 
imageViewController.imageView.image = ... 

Это будет вылетать, если ImageView неявно разворачивал вместо ленивого не опционального.

Смежные вопросы