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

如何将登录HTTP请求返回的user_id传递到其他视图控制器全局使用

解决方案

方案1:使用UserDefaults持久化存储(适合需要保留登录状态、App重启后无需重新登录的场景)

登录成功解析到userID后直接写入UserDefaults:

let decoder = JSONDecoder()
let loginResponse = try decoder.decode(LoginResponse.self, from: json)
// 按实际类型选择存储方法,id为Int或String都可直接调用set(_:forKey:)
UserDefaults.standard.set(loginResponse.data.id, forKey: "loggedInUserID")

需要使用userID的位置直接读取即可:

// 对应id类型读取,示例为Int类型,String类型用string(forKey: "loggedInUserID")
guard let userID = UserDefaults.standard.object(forKey: "loggedInUserID") as? Int else {
    // 无有效用户id的异常处理,比如跳转登录页
    fatalError("用户未登录")
}
let resourceString = "https://*******.herokuapp.com/\(userID)/allergies"
guard let resourceURL = URL(string: resourceString) else {fatalError()}

方案2:全局单例类管理用户信息(适合需要管理多用户字段、扩展性要求高的场景)

新建UserManager.swift全局用户管理类:

class UserManager {
    // 全局唯一实例
    static let shared = UserManager()
    // userID属性,自动同步到UserDefaults实现持久化
    var userID: Int? {
        get {
            UserDefaults.standard.object(forKey: "loggedInUserID") as? Int
        }
        set {
            UserDefaults.standard.set(newValue, forKey: "loggedInUserID")
        }
    }
    // 禁止外部创建新实例
    private init() {}
}

登录成功后赋值:

let decoder = JSONDecoder()
let loginResponse = try decoder.decode(LoginResponse.self, from: json)
UserManager.shared.userID = loginResponse.data.id

其他位置使用时直接读取:

guard let userID = UserManager.shared.userID else {
    fatalError("用户未登录")
}
let resourceString = "https://*******.herokuapp.com/\(userID)/allergies"
guard let resourceURL = URL(string: resourceString) else {fatalError()}

注意事项

  • 不建议直接声明全局裸变量存储userID,会降低代码可维护性,也不方便做登录状态校验
  • 如果仅需要会话内临时存储,不需要持久化,可去掉UserManager中属性的get/set绑定,直接声明普通存储属性即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:24:01