2016-12-14 5 views
0

Betrachten Sie den folgenden Codeblockoptional Verkettungs und optional ungeöffneten Optionals

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

Hier f zu verstehen, ist eine optionale Verpackung CGRect. Soweit ich verstehen kann,

  • Ansicht ist implizit ungeöffnete Eigenschaft. (D. UIView!).
  • Wir greifen auf die Fenster Eigenschaft davon mit optional Auspacken der optionalen Fenstereigenschaft der Ansicht. Wenn es Wert hat, dann Zugriff auf seine rootViewController Eigenschaft sonst nichts tun.
  • Ebenso können wir optional rootViewController auspacken und auf view Eigenschaft zugreifen.

  • Endlich bekommen wir frame der Ansicht.

Da jede der Fenster oder RootViewController Null sein kann, ist ein Rahmen Optional.

Ich verstehe es richtig. Auch warum die Ansicht Eigenschaft von UIViewcontroller ist optional?

+0

'view' davon:' rootViewController? .view'? –

+1

@ Mr.Bista Ansicht ist nicht optional. es ist implizit optional ausgepackt. Es kann nicht nil sein, deshalb kannst du es nicht optional verketten. –

+1

Ya, darum habe ich gefragt. –

Antwort

0

Ja, Ihr Verständnis ist richtig.

"Insbesondere ist das Ergebnis eines optionalen Verkettungsaufrufs vom gleichen Typ wie der erwartete Rückgabewert, aber in einem optionalen Wrapping eingeschlossen. Eine Eigenschaft, die normalerweise einen Int zurückgibt, gibt einen Int? Wenn auf sie über die optionale Verkettung zugegriffen wird. "

Auszug aus: Apple Inc." Die Swift-Programmiersprache (Swift 3.0.1). "iBooks.

UIViewController implementiert Lazy Laden seiner Ansicht. Die Methode loadView ist dafür zuständig, entweder die Ansichtshierarchie (aus einer NIB- oder Storyboard-Szene) zu laden oder sie über Code zu erstellen. Als Ergebnis wird viewnil zwischen Initialisierung und wenn die view Propery zum ersten Mal referenziert wird.

0

Ansicht ist implizit unverpackte Eigenschaft (d. H. UIView!).

Korrekt.

Wir greifen auf die Fenstereigenschaft davon zu, indem wir optional die optionale Fenstereigenschaft der Ansicht auspacken. Wenn es Wert hat, dann greife auf seine rootViewController-Eigenschaft zu, ansonsten tue nichts.

Der erste Teil ist korrekt, aber der zweite Teil ist ein bisschen falsch. Wenn window keinen Wert hat, d.h. nil, tut der Code nicht nichts tun. Der gesamte Ausdruck wird als nil ausgewertet. In diesem Fall wird nilf zugewiesen.

Ebenso können wir optional rootViewController auspacken und auf seine View-Eigenschaft zugreifen.

Endlich bekommen wir den Sichtbereich.

Das stimmt.

Da eines der Fenster oder rootViewController NULL sein kann, ist Frame ein Optional.

Technisch, nein. frame ist immer noch ein nicht-optionaler Typ. Es scheint nur wie ein optionales, weil alle diejenigen, die Sie entpacken. fist ein optionales obwohl.

Auch warum die View-Eigenschaft von UIViewcontroller ist optional?

Der Zweck von UIViewController ist die Steuerung und Verwaltung einer UIView. Wenn UIViewController initialisiert wird, muss es nicht unbedingt eine Ansicht verwalten! Die Ansicht wird geladen, bevor viewDidLoad (in der loadView-Methode) aufgerufen wird. Das ist der Grund, warum Sie den gesamten Subview-Code in viewDidLoad anstatt im Initialisierer hinzufügen.