Swift中Storyboard视图控制器实例化代码含义及实例创建疑问
instantiateInitialViewController()的疑问解答 先明确核心代码的作用:
let popup = sb.instantiateInitialViewController() as! DatePopupViewController
这行代码的意思是:从你指定的DatePopupViewController.storyboard文件中,初始化并取出它标记为「初始视图控制器」的对象,通过as!强制将其类型转换为DatePopupViewController,最后把这个对象赋值给常量popup。
针对你的三个疑问逐一解答:
1. 是否创建了DatePopupViewController类的实例?
是的。instantiateInitialViewController()方法内部会帮你完成实例创建:它会读取Storyboard里的配置信息,调用该类的init?(coder: NSCoder)初始化方法(这是Storyboard创建控制器的标准初始化器),生成一个全新的DatePopupViewController实例。你没直接写DatePopupViewController(),只是因为初始化逻辑被Storyboard的封装方法接管了,本质还是创建了类的实例。2. 是否将DatePopupViewController类的某个值赋值给popup常量?
准确说是把DatePopupViewController的实例对象赋值给了popup。类是一种类型,popup存储的是这个类型具体实例的引用(Swift中类属于引用类型),不是类本身的某个值。3. 是否创建了DatePopupViewController类的副本?
没有。类是引用类型,这里instantiateInitialViewController()每次调用都会生成一个全新的实例,不存在“副本”概念——副本一般针对结构体、枚举这类值类型,类的赋值是传递引用,不是复制对象本身。
补充疑问解答:
你习惯的let item = Item(name: "Car")是手动调用自定义初始化器创建实例的方式,而通过Storyboard创建控制器,是系统帮你调用了init?(coder: NSCoder)这个初始化器(遵循NSCoding协议的类必须实现,用于从Storyboard的归档数据中解码生成实例)。虽然你没直接写初始化器的括号,但实例创建的过程已经在instantiateInitialViewController()内部完成了,所以这确实是创建了DatePopupViewController的实例。
内容的提问来源于stack exchange,提问作者maxMas

