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

Swift中如何修改枚举内Mapper的特定枚举对应值?

解决AuthenticationToken枚举与AppDelegate token同步更新的问题

你的问题核心在于静态常量mapper只会在枚举首次被访问时初始化一次,之后AppDelegate里的token更新时,它不会自动同步。下面提供两种可行的解决方案,你可以根据场景选择:

方案一:使用静态计算属性自动同步(推荐)

把mapper从不可变的static let改为动态计算的static var,这样每次访问mapper时,都会实时从AppDelegate获取最新的token值,无需手动触发更新:

import UIKit

enum AuthenticationToken: Int {
    case admin
    case customer
    
    // 封装AppDelegate的获取逻辑,避免重复代码
    private static var appDelegate: AppDelegate {
        return UIApplication.shared.delegate as! AppDelegate
    }
    
    // 改为计算属性,每次访问都返回最新的token映射
    static var mapper: [AuthenticationToken: String] {
        [
            .admin: appDelegate.adminToken,
            .customer: appDelegate.customerToken
        ]
    }
    
    var string: String {
        "Bearer " + AuthenticationToken.mapper[self]!
    }
}

为什么这样可行?

计算属性不会存储值,每次访问mapper都会重新执行闭包里的逻辑,自然就能拿到AppDelegate中最新的adminToken和customerToken。这种方式最简洁,完全不需要额外的手动更新操作。

方案二:手动触发更新(适合性能敏感场景)

如果创建mapper的逻辑比较耗时,你可以把它改为可变的静态变量,然后提供一个更新方法,在AppDelegate的token变化时主动调用:

import UIKit

enum AuthenticationToken: Int {
    case admin
    case customer
    
    private static var appDelegate: AppDelegate {
        return UIApplication.shared.delegate as! AppDelegate
    }
    
    // 初始化时设置初始值,之后可以手动更新
    static var mapper: [AuthenticationToken: String] = {
        [
            .admin: appDelegate.adminToken,
            .customer: appDelegate.customerToken
        ]
    }()
    
    // 提供更新方法,在token变化时调用
    static func updateTokenMapper() {
        mapper = [
            .admin: appDelegate.adminToken,
            .customer: appDelegate.customerToken
        ]
    }
    
    var string: String {
        "Bearer " + AuthenticationToken.mapper[self]!
    }
}

使用方式

当你在AppDelegate中更新token时,调用这个方法同步:

// 比如更新adminToken后
adminToken = newAdminToken
AuthenticationToken.updateTokenMapper()

额外建议

  • 确保AppDelegate的类型转换是安全的,如果你的项目用了SceneDelegate,可能需要调整获取根 delegate 的方式。
  • 如果你担心mapper[self]!的强制解包会崩溃,可以改为可选绑定,比如:
    var string: String? {
        guard let token = AuthenticationToken.mapper[self] else { return nil }
        return "Bearer " + token
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:26:24