Почему при даункастинге мне не нужно использовать инициализатор ItemsTableViewController? Это инициализировано? - PullRequest
0 голосов
/ 29 апреля 2018

Я работаю над учебником и заметил, что при даункастинге мне не нужно было использовать метод инициализации объекта. Объект инициализирован? В кодовой базе AppDelegate ниже я имею в виду ItemsTableViewController. Все, что мне нужно было сделать, это сказать «как!» но не нужно было использовать метод init или двойные скобки, например, «ItemsTableViewController ()».

Происходит ли инициализация ItemsTableViewController и, если да, то как?

//
//  AppDelegate.swift
//  HomepwnerThirdTime
//
//  Created by Laurence Wingo on 4/26/18.
//  Copyright © 2018 Laurence Wingo. All rights reserved.
//

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        //create an ItemStore when the application launches
        let itemStore = ItemStore()

        //create an ItemsTableViewController
        //set the window property which is of type UIWindow from the UIApplicationDelegate protocol and downcast this property to an initialized ItemsTableViewController by using as!
        let itemsController = window!.rootViewController as! ItemsTableViewController
        //now access the ItemsTableViewController and set its itemStore property since it is unwrapped in the ItemsTableViewController which needs to be set
        itemsController.itemStore = itemStore
        //we just set the itemStore property of the ItemsTableViewController!  Yayy, WHEW!! Now when the ItemsTableViewController is accessed with that unwrapped ItemStore object then it will be set!!! WHHHHEEEEWWWWW!
        return true
    }
}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

rootViewController обязательно инициализирован. Если это не так, то это было бы nil, и приведение его с использованием as! вызвало бы ошибку. Здесь, принижая, вы ничего не делаете с объектом VC. Вы просто говорите Swift: «Да, я уверен, что к моменту запуска кода это будет ItemsTableViewController, так что не беспокойтесь об этом».

Как инициализируется VC?

Это связано с тем, как iOS управляет запуском приложения. Когда вы нажимаете на приложение, оно открывается и создается UIWindow. Затем первый VC в вашей раскадровке инициализируется и устанавливается как rootViewController из UIWindow. После всего этого ваш делегат приложения вызывается.

Обратите внимание, что когда вы используете метод didFinishLaunching, просто создается ВК. просмотров в ВК не загружены. Вот для чего viewDidLoad.

0 голосов
/ 29 апреля 2018

Приведение и инициализация не имеют ничего общего друг с другом.

Приведение - это просто способ сказать компилятору: «Поверьте мне, даже если вы думаете, что этот объект относится к одному типу, я знаю, что это действительно другой тип».

Инициализация - это, конечно, создание нового объекта.

В вашем коде ваш контроллер представления уже создан для вас через раскадровку. Ваш код просто обращается к этому уже созданному контроллеру представления. В ролях вы говорите компилятору, что rootViewController на самом деле является экземпляром ItemsTableViewController, а не простым старым UIViewController.

...