如何在Swift的init()初始化方法中使用setter和getter?
解决方案
你遇到的问题是Swift初始化安全规则导致的:在所有存储属性完成初始化前,不能访问self(包括计算属性),所以直接在init里赋值给twiceAsMuch会报错。要满足你的需求(避免重复逻辑、保证data编译时初始化),可以把转换逻辑抽离成独立方法,让初始化器和计算属性的setter共享同一逻辑:
fileprivate struct Foo { var data: Int var twiceAsMuch: Int { set(value) { data = Self.convertTwiceValueToData(value) } get { data * 2 } } init(twice: Int) { // 直接用抽离的逻辑初始化data,符合Swift初始化规则 data = Self.convertTwiceValueToData(twice) } // 把重复的转换逻辑抽成私有静态方法,实际复杂逻辑只需要写一次 private static func convertTwiceValueToData(_ value: Int) -> Int { value / 2 // 替换成你实际的复杂逻辑即可 } }
方案符合需求的原因
- 无重复逻辑:转换逻辑仅在
convertTwiceValueToData中实现一次,初始化器和setter都调用该方法复用逻辑 - 编译时保证
data初始化:init里直接给data赋值,既没有默认值也不是可选类型,编译器会确保data被正确初始化 - 遵守Swift初始化规则:完全符合Swift对存储属性初始化的安全要求,不会出现编译错误
内容的提问来源于stack exchange,提问作者orion elenzil
相关产品推荐
相关产品推荐

