2016-12-14 8 views
0

Рассмотрит следующему блоку кодаПонимания опциональных цепочек и необязательно распакованный OPTIONALS

// self is a UIViewController 
let f = self.view.window?.rootViewController?.view.frame 

Здесь п является необязательным обертыванием CGRect. Насколько я могу понять,

  • вид неявно развернутый свойство. (Т.е. UIView!).
  • Мы обращаемся к окну его свойства с возможностью разворачивания дополнительного свойства окна вида. Если он имеет значение, то доступ к свойству rootViewController ничего не делает.
  • Аналогичным образом мы по желанию разворачиваем rootViewController и обращаемся к его вид.

  • И наконец, мы получаем frame.

Поскольку любой из окна или RootViewController может быть нулем, рамка является необязательной.

Правильно ли я это понимаю. Также почему вид объект UIViewcontroller не является обязательным?

+0

'view' из этого:' rootViewController? .view'? –

+1

@ Вид Mr.Bista не является обязательным. он неявно разворачивается необязательно. Это не может быть nil, поэтому вы не можете его опционально цепочки. –

+1

Я, вот почему я спрашивал. –

ответ

0

Да, ваше понимание верное.

«В частности, результат необязательного вызова цепочки имеет тот же тип, что и ожидаемое возвращаемое значение, но завернутый в необязательный. Свойство, которое обычно возвращает Int, вернет Int? при доступе через дополнительную цепочку ».

Выписка от: Apple Inc.« Язык быстрого программирования (Swift 3.0.1) ». iBooks.

UIViewController выполняет ленивую погрузку по своему усмотрению. Метод loadView отвечает за загрузку иерархии представлений (из сценария NIB или Storyboard) или ее создание через код. В результате view будет nil между инициализацией и когда на главную ссылку view.

0

вид неявно разворачивается. (Т. Е. UIView!).

Исправить.

Мы получаем доступ к свойству окна из него с возможностью разворачивания дополнительного свойства окна вида. Если он имеет значение, то доступ к свойству rootViewController еще ничего не делает.

Первая часть правильная, но вторая часть немного неправильная. Если window не имеет значения, то есть nil, код не ничего не делать. Все выражение оценивается как nil. В этом случае nil будет присвоен f.

Аналогичным образом мы по желанию разворачиваем rootViewController и получаем доступ к его виду.

И наконец, мы получаем раму зрения.

Это верно.

Поскольку любое из окон или rootViewController может быть nil, кадр является необязательным.

Технически, нет. frame по-прежнему не является необязательным. Это только кажется как необязательный, потому что все те, которые вы развернули, сделали. fявляется необязательным, хотя.

Также почему свойство view UIViewcontroller не является обязательным?

Целью UIViewController является контроль и управление UIView. Когда инициализируется UIViewController, нет необходимости просматривать его для управления! Вид загружается непосредственно перед вызовом viewDidLoad (в методе loadView). Вот почему вы делаете все добавление кода subviews в viewDidLoad вместо инициализатора.

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

  • Нет связанных вопросов^_^