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

iOS开发:如何临时设置Singleton的Flag值并自动恢复,无需多case重置

最优解决方案:利用defer自动恢复状态

首先修正原代码的两个关键问题:

  1. 单例类中checkRegularAccount是let常量,无法修改,需改为var
  2. 单例类缺少标准的单例实例定义(shared属性)

核心思路是在case 7的代码块内,先将标志设为true,再通过defer语句确保该分支的代码执行完毕后,自动将标志恢复为false。defer的特性是无论代码块以何种方式退出(正常执行、提前返回、抛出错误),都会执行其中的代码,完美满足“仅在分支执行期间为true”的需求,且无需修改其他9个分支。

修正后的单例代码

class SingletonDemo {
    // 标准单例实例
    static let shared = SingletonDemo()
    // 改为可变属性,默认值为false
    var checkRegularAccount = false
    
    // 私有构造器,防止外部创建实例
    private init() {}
}

修改后的ViewController代码

class AccountView {
    func handleAccountType(_ accountType: Int) {
        switch(accountType) {
        case 0: 
            // 执行case 0业务逻辑
        case 1: 
            // 执行case 1业务逻辑
        case 2: 
            // 执行case 2业务逻辑
        case 3: 
            // 执行case 3业务逻辑
        case 4: 
            // 执行case 4业务逻辑
        case 5: 
            // 执行case 5业务逻辑
        case 6: 
            // 执行case 6业务逻辑
        case 7: 
            // 将标志临时设为true
            SingletonDemo.shared.checkRegularAccount = true
            // 确保当前分支执行完毕后自动恢复标志为false
            defer {
                SingletonDemo.shared.checkRegularAccount = false
            }
            // 这里编写case 7的核心业务逻辑,执行期间标志始终为true
            print("Case 7执行中,标志值:\(SingletonDemo.shared.checkRegularAccount)")
        case 8: 
            // 执行case 8业务逻辑
        case 9: 
            // 执行case 9业务逻辑
        default: 
            // 执行默认分支逻辑
        }
    }
}

方案优势

  • 零侵入其他分支:仅在case 7内添加代码,完全不影响其他分支的原有逻辑
  • 状态绝对安全:defer保证标志一定会被重置,避免因分支内提前返回或异常导致状态残留
  • 逻辑集中易维护:状态变更与恢复的逻辑集中在一处,后续修改更便捷

内容的提问来源于stack exchange,提问作者Sagar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:45:33