向下转型时无需调用ItemsTableViewController初始化器?它是否已初始化?
关于ItemsTableViewController初始化的问题解答
嘿,这个问题问得特别关键!首先可以明确告诉你:你用as!强转的那个ItemsTableViewController实例肯定已经完成初始化了,不然这种强制类型转换会直接触发运行时崩溃(CastError)。
下面结合HomepwnerThirdTime这个经典iOS教程项目的常见场景,给你拆解它的初始化路径:
核心逻辑:as!的前提是对象已存在
as!是强制类型转换,它的作用是告诉编译器“我确定这个对象就是ItemsTableViewController类型的实例”——这意味着这个实例必须已经被创建并初始化过,不然根本没有对象可以让你转换。
常见的初始化场景(对应Homepwner项目)
在这个项目里,ItemsTableViewController的初始化通常是以下两种方式之一:
1. 由UIKit从Storyboard自动初始化
这是教程里最常见的情况:
- 你应该已经在Storyboard中拖入了TableViewController,并将它的类设置为
ItemsTableViewController。 - 当App启动时,UIKit加载Storyboard文件时,会自动调用控制器的
init?(coder:)初始化方法(如果没有自定义初始化逻辑,系统会默认提供这个初始化器),完成实例的创建和初始化。 - 比如你在AppDelegate里的代码可能是这样的:
这里的func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { window = UIWindow(frame: UIScreen.main.bounds) let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) let navController = mainStoryboard.instantiateInitialViewController() as! UINavigationController // 这里的topViewController就是已经初始化好的ItemsTableViewController实例 let itemsVC = navController.topViewController as! ItemsTableViewController window?.rootViewController = navController window?.makeKeyAndVisible() return true }itemsVC就是Storyboard加载过程中已经被UIKit初始化完成的实例,所以你直接强转就行,不需要自己调用ItemsTableViewController()。
2. 提前手动创建并初始化
如果你的项目没有用Storyboard,那可能是在AppDelegate的启动代码里,你已经手动创建了这个控制器的实例:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { window = UIWindow(frame: UIScreen.main.bounds) // 手动初始化ItemsTableViewController let itemsVC = ItemsTableViewController(style: .plain) let navController = UINavigationController(rootViewController: itemsVC) window?.rootViewController = navController window?.makeKeyAndVisible() // 之后某个地方拿到这个已初始化的实例并强转 let existingItemsVC = navController.topViewController as! ItemsTableViewController return true }
这种情况下,existingItemsVC是之前已经手动初始化好的实例,自然不需要再调用初始化方法。
总结
你能成功用as!强转,就证明目标对象本身就是一个已经完成初始化的ItemsTableViewController实例。它的初始化要么是UIKit加载Storyboard时自动完成的,要么是你在代码里提前手动创建的——总之在你强转之前,这个实例就已经存在了。
内容的提问来源于stack exchange,提问作者Laurence Wingo
相关产品推荐
相关产品推荐

