iOS开发:如何临时设置Singleton的Flag值并自动恢复,无需多case重置
最优解决方案:利用
defer自动恢复状态 首先修正原代码的两个关键问题:
- 单例类中
checkRegularAccount是let常量,无法修改,需改为var - 单例类缺少标准的单例实例定义(
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
相关产品推荐
相关产品推荐

