自定义初始化器确保变量无Nil值,为何无法省略speed参数创建TIE实例?
Swift中TIE类初始化器的疑问解答
你编写的代码如下:
class TIE { var name: String var speed: Int init(name: String, speed: Int) { self.name = name self.speed = speed } } let fighter = TIE(name: "wow") print(fighter.speed)
为什么不能仅传入name参数创建实例?
你当前只给TIE类定义了一个需要同时传入name和speed的初始化器,Swift会以此作为唯一的初始化规则,没有其他初始化逻辑支持只传name的情况。另外,speed是没有默认值的Int类型存储属性,Swift要求所有存储属性在实例完全初始化前必须拥有确定的非nil值,只传name的话speed会处于未初始化状态,编译器不允许这种情况发生。
为什么必须同时传入speed参数?
因为你定义的自定义初始化器明确要求调用者提供这两个参数来完成属性赋值,以此保证实例创建时name和speed都有合法值。这是你自己设定的初始化规则——强制每个TIE实例必须被明确赋予速度值,避免出现属性遗漏初始化的问题。
这个自定义初始化器是不是毫无用处?
当然不是。它的作用就是强制约束实例创建的条件:如果你的业务逻辑要求每个TIE战斗机必须明确指定速度,这个初始化器就能从编译层面杜绝开发者忘记设置speed的情况,确保实例的完整性。如果你希望支持只传name的创建方式,只需调整代码即可,比如:
方案1:给speed参数添加默认值
class TIE { var name: String var speed: Int // 给speed参数设置默认值,支持两种初始化方式 init(name: String, speed: Int = 0) { self.name = name self.speed = speed } } // 两种创建方式都合法 let fighter1 = TIE(name: "wow") let fighter2 = TIE(name: "speedy", speed: 100)
方案2:添加便捷初始化器
class TIE { var name: String var speed: Int init(name: String, speed: Int) { self.name = name self.speed = speed } // 便捷初始化器复用主初始化器,给speed设定默认值 convenience init(name: String) { self.init(name: name, speed: 0) } } let fighter = TIE(name: "wow") // 现在可以正常创建
内容的提问来源于stack exchange,提问作者Brody Kavanagh
相关产品推荐
相关产品推荐

