如何在Singleton单例模式中更新Settings类的lan变量?
解决方案
问题根源
你当前代码的问题在于:调用MOLH.setLanguageTo()后,立即调用MOLHLanguage.currentAppleLanguage()时,MOLH内部的语言状态还未完成更新,此时拿到的仍然是切换前的旧语言值,导致赋值给Settings.shared.lan的内容并未同步到目标语言。MOLH.reset()才会触发应用语言环境的真正切换,但这一步是在你赋值之后执行的,所以旧值被写入了lan变量。
修复方法
方法1:提前计算目标语言,同步设置给MOLH和Settings
直接计算出要切换的目标语言,同时赋值给MOLH和Settings,避免依赖MOLHLanguage.currentAppleLanguage()的实时返回值:
@IBAction func languageBtnTabbed(_ sender: Any) { // 提前计算目标语言 let targetLang = MOLHLanguage.currentAppleLanguage() == "en" ? "ar" : "en" // 同时设置MOLH和Settings MOLH.setLanguageTo(targetLang) Settings.shared.lan = targetLang print(targetLang) MOLH.reset() }
方法2:给lan添加didSet监听(你提到的可行方案)
如果需要在语言变化时触发额外逻辑,可以给Settings的lan变量添加didSet,同时保证赋值的是正确的目标语言:
class Settings{ static let shared = Settings() var lan: String? = "ar" { didSet { // 语言变化时的额外操作,比如通知其他模块更新 print("当前语言已更新为:\(lan ?? "未知")") } } private init(){ // 初始化时同步当前系统语言 lan = MOLHLanguage.currentAppleLanguage() } }
配合方法1的按钮点击代码,就能确保lan被正确更新,且didSet会触发对应的逻辑。
额外说明
如果希望Settings的lan始终与MOLH的当前语言保持一致,也可以将lan改为计算属性,实时获取MOLH的语言值:
class Settings{ static let shared = Settings() var lan: String? { get { return MOLHLanguage.currentAppleLanguage() } set { if let newLang = newValue { MOLH.setLanguageTo(newLang) MOLH.reset() } } } private init(){} }
这种情况下,读取lan会直接获取最新的MOLH语言,赋值lan则会触发语言切换和应用重置。
内容的提问来源于stack exchange,提问作者Mahmoud Arafat
相关产品推荐
相关产品推荐

