Swift中两种MyViewController属性声明写法的区别及对应术语问询
Swift 两种属性声明写法差异说明
官方术语定义
- 写法1
private let myViewController = MyViewController():存储属性即时初始化,属于 Swift 标准存储属性的默认初始化赋值方式。 - 写法2
private let myViewController: MyViewController!:隐式解包可选型存储属性声明,属于延迟初始化场景下的特殊声明方式。
核心区别
1. 初始化逻辑差异
- 写法1会在当前所属类的实例完成初始化的同时,同步创建
MyViewController实例并赋值给属性,属性整个生命周期内都持有有效值,不可能为空。 - 写法2仅完成属性的类型声明,当前所属类实例初始化时属性默认值为
nil,需要你在后续业务流程中(比如viewDidLoad、依赖参数准备完成后)手动完成赋值,未赋值前访问该属性会直接触发 runtime 崩溃。
2. 类型安全差异
- 写法1的属性类型会被编译器自动推导为非可选的
MyViewController,所有调用场景不需要做任何解包操作,编译器会全程保证属性有值,类型安全性最高。 - 写法2的属性本质是
ImplicitlyUnwrappedOptional<MyViewController>(隐式解包可选型),属于可选型的特殊子类,调用时编译器会自动完成解包,不需要手动加?或!,但如果属性为空会直接崩溃,类型安全性较低。
3. 适用场景差异
- 写法1适合
MyViewController的初始化不需要依赖当前类的其他属性、也不需要外部传入动态参数的场景,逻辑简单无额外风险。 - 写法2适合
MyViewController的初始化需要依赖外部参数、或者当前类的其他延迟生成属性的场景,比如自定义控制器需要传入业务模型才能初始化的场景,就可以先通过该方式声明属性,等依赖参数准备完成后再赋值。
额外说明
写法2虽然用let声明为常量,但由于隐式解包可选型默认初始值为nil,你可以在后续流程中对其进行一次赋值,赋值完成后就受到let的不可修改约束,无法再变更值。
内容的提问来源于stack exchange,提问作者Yuuu
相关产品推荐
相关产品推荐

