You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:35:18