You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中Storyboard视图控制器实例化代码含义及实例创建疑问

关于Swift中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:46:00