Swift自定义初始化器:能否不初始化结构体部分属性?
在Swift结构体中创建仅初始化部分属性的自定义初始化器
嘿,刚入门编程没几天就碰到这个问题太正常啦!我来帮你搞清楚怎么解决~
首先得明白为什么你现在会报错:Swift要求结构体的所有存储属性在初始化完成时必须有确定的值。如果你自定义了初始化器,但没给其他属性赋值,编译器就会懵——它不知道那些没被赋值的属性该用什么值,所以就会报错。
下面给你两种简单的解决方法,选哪种都可以:
方法一:给未初始化的属性设置默认值
直接在结构体定义时,给那些你不想在自定义初始化器里赋值的属性加上默认值。这样初始化时,这些属性会自动使用默认值,你只需要管你关心的那三个属性就行:
struct Coffee { // 你想初始化的三个属性 let caffeineAmountMg: Int let countryOfOrigin: String let taste: String // 给其他属性设置默认值 let price: Double = 4.99 let size: String = "grande" // 自定义初始化器 init(caffeineAmountMg: Int, countryOfOrigin: String, taste: String) { self.caffeineAmountMg = caffeineAmountMg self.countryOfOrigin = countryOfOrigin self.taste = taste // 不用管price和size,它们已经有默认值啦 } } // 现在就能正常创建你想要的实例了! var starbucks = Coffee(caffeineAmountMg: 1200, countryOfOrigin: "South America", taste: "bad")
方法二:用扩展(extension)写自定义初始化器
如果你不想给属性加默认值,或者还想保留结构体默认的成员初始化器(就是能给所有属性赋值的那种),可以把自定义初始化器写到扩展里。这样默认的初始化器不会被覆盖,两种初始化方式都能用:
struct Coffee { // 所有存储属性,没有默认值 let caffeineAmountMg: Int let countryOfOrigin: String let taste: String let price: Double let size: String } extension Coffee { // 在扩展里定义自定义初始化器 init(caffeineAmountMg: Int, countryOfOrigin: String, taste: String) { self.caffeineAmountMg = caffeineAmountMg self.countryOfOrigin = countryOfOrigin self.taste = taste // 这里手动给其他属性赋值,或者也可以用默认值 self.price = 4.99 self.size = "grande" } } // 两种初始化方式都支持: var myCoffee = Coffee(caffeineAmountMg: 1200, countryOfOrigin: "South America", taste: "bad") var fullCustomCoffee = Coffee(caffeineAmountMg: 800, countryOfOrigin: "Ethiopia", taste: "smooth", price: 5.99, size: "venti")
简单总结一下:要么给未赋值的属性加默认值,要么在扩展里写自定义初始化器并手动给其他属性赋值,这样就能满足你只初始化三个属性的需求啦~
内容的提问来源于stack exchange,提问作者serp002
相关产品推荐
相关产品推荐

