如何在Alamofire中跨类/视图控制器复用UserDefaults存储的默认值?
如何在其他类/视图控制器中复用UserDefaults存储的值?
我先声明存储对象:
let PointHistory = UserDefaults.standard,随后在按钮点击事件中使用Alamofire发起请求:@IBAction func buttonPointHistory(_ sender: UIButton) { let parameters: Parameters=[ "Card_No":labelCardNo.text! ] Alamofire.request(URL, method: .post, parameters: parameters).responseJSON { response in print(response) self.PointHistory.set(PointHistoryURL, forKey: "Points") } }现在我的问题是,如何在其他类或视图控制器中返回或复用该存储的值?
其实复用UserDefaults里存储的值非常简单,因为UserDefaults.standard是全局单例对象,你可以在任何类中直接访问它。我给你拆解几个关键步骤:
1. 在目标类/视图控制器中读取值
不管是在新的视图控制器还是工具类里,直接通过UserDefaults.standard读取对应键的值就行。举个例子:
// 在任意需要复用值的类中 if let savedPointURL = UserDefaults.standard.string(forKey: "Points") { // 成功拿到存储的PointHistoryURL,直接用就行 print("已读取存储的Points值:\(savedPointURL)") // 比如用来发起新请求、展示在UI上都可以 } else { // 如果没找到对应值,可以做默认处理(比如提示用户无数据) print("未找到存储的Points相关数据") }
2. 优化你的存储逻辑(可选但推荐)
我注意到你用了PointHistory作为UserDefaults.standard的别名,其实可以进一步优化:把存储的键名定义成全局常量,避免拼写错误,后期维护也更方便。比如:
// 定义全局常量,统一键名 let kPointsStorageKey = "Points" // 存储的时候用这个常量 UserDefaults.standard.set(PointHistoryURL, forKey: kPointsStorageKey) // 读取的时候也用同一个常量 if let savedPointURL = UserDefaults.standard.string(forKey: kPointsStorageKey) { // 使用值 }
这样以后要改键名的话,只需要改一处就搞定,不用在代码里到处找字符串。
3. 注意数据类型匹配
一定要保证存储和读取的类型一致!比如如果PointHistoryURL是URL类型,那读取时要用url(forKey:)而不是string(forKey:):
// 存储URL对象 UserDefaults.standard.set(PointHistoryURL, forKey: kPointsStorageKey) // 读取URL对象 if let savedPointURL = UserDefaults.standard.url(forKey: kPointsStorageKey) { // 使用这个URL }
类型不匹配的话会直接返回nil,这点一定要注意。
内容的提问来源于stack exchange,提问作者pgrueda
相关产品推荐
相关产品推荐

