SwiftUI中类自定义初始化器的作用及删除报错原因问询
关于Swift类自定义初始化器的疑问解答
你的TIE类包含两个非可选的存储属性name和speed,它们既没有默认值,也不是可选类型(如String?)。在Swift中,所有非可选存储属性必须在实例完全创建完成前被赋值,这是编译器强制执行的安全规则,你的疑问都围绕这个核心规则展开:
1. 第4-7行自定义初始化器的作用
这段代码定义的init(name: String, speed: Int)是一个指定初始化器,核心作用有两个:
- 在创建
TIE实例时,接收外部传入的名字和速度参数 - 通过
self.name = name和self.speed = speed,把传入的值赋值给类内部的属性,确保实例创建完成时,所有非可选属性都拥有合法的初始值
2. 为什么类中需要这段代码?
Swift的类和结构体的初始化逻辑有本质区别:结构体如果没有自定义初始化器,编译器会自动生成一个成员初始化器(即把所有属性作为参数的初始化器),但类不会自动生成这种带参数的初始化器。
你的TIE类里的name和speed既没有默认值,又不是可选类型,所以必须手动提供初始化器来给这两个属性赋值——否则编译器无法保证实例创建时属性都被正确初始化,会直接阻断编译流程。
3. 删除这段代码后无法运行的原因
删除自定义初始化器后,代码会触发两层错误:
- 第一,类的两个非可选属性没有默认值,也没有任何初始化器为它们赋值,违反了Swift的初始化安全规则,编译器会提示“类中的存储属性未初始化”
- 第二,你创建实例时调用的
TIE(name: "wow", speed: 50)是一个带两个参数的初始化器,但此时类中根本不存在这个初始化器(编译器不会给类自动生成成员初始化器),编译器会额外提示“找不到匹配的初始化器”
这两个问题叠加,导致代码完全无法通过编译运行。
内容的提问来源于stack exchange,提问作者Brody Kavanagh
相关产品推荐
相关产品推荐

