问题描述
在类的init()初始化过程中发现相关报错:
'self' used in method call 'loadUserSelectedSource' before all stored properties are initialized
'self' used in method call 'loadCommonCurrencies' before all stored properties are initialized
'self' used in method call 'judgeSource' before all stored properties are initialized
Return from initializer without initializing all stored properties
报错代码为:
// 初始化
private init() {
// 初始化用户选择的汇率来源
loadUserSelectedSource() // 报错行
// 加载常用的五个币种
loadCommonCurrencies() // 报错行
// 根据汇率数据来源判断调取的汇率代码
judgeSource() // 报错行
}
问题原因:Swift在初始化阶段不允许使用self之前调用实例方法,因为实例属性还没有完全初始化。当我在init()方法中调用了loadUserSelectedSource()、loadCommonCurrencies() 和 judgeSource(),而这些方法都使用了 self,导致编译错误。
解决方案
需要确保在调用这些方法之前,所有存储属性都已经初始化完成。可以给未赋值的属性设置一个默认值。
// 汇率信息结构
@Published var ExchangeRateStruct: ExchangeRateStruct
给ExchangeRateStruct设置一个默认值,在init开始时对其进行初始化,确保初始化后再调用方法。
// 初始化
private init() {
// 初始化 ExchangeRateStruct 为一个默认值
self.ExchangeRateStruct = ExchangeRateStruct(
sourceName: "",
jsonURL: "",
baseCurrency: nil,
syncDate: Date(),
availableCurrencies: [],
exchangeRates: [:]
)
// 现在可以安全调用这些方法,因为所有存储属性都已初始化
loadUserSelectedSource()
loadCommonCurrencies()
judgeSource()
}
通过在 init 方法中先设置 ExchangeRateStruct 的默认值,确保 self 在方法调用之前就已经完全初始化。
一旦所有的属性都设置完成,就可以调用其他方法而不会触发编译错误。