从 UserDefaults 获得的布尔值打印为 0 或 1,即使保存为 Any

Posted

技术标签:

【中文标题】从 UserDefaults 获得的布尔值打印为 0 或 1,即使保存为 Any【英文标题】:Boolean value obtained from UserDefaults printing as 0 or 1 even when saved as Any 【发布时间】:2017-09-23 13:17:58 【问题描述】:

我正在将 [String : Any] 类型的字典保存到 UserDefaults,

当我在保存到 UserDefaults 之前打印字典时,字典中的布尔值会打印为 true 或 false,但是当我检索字典时,它会打印为 0 或 1。

我看到过类似的 SO 问题,建议使用 Any 而不是 AnyObject,我这样做了。

以下是我正在使用的代码,请指出我哪里出错了。

static var profileDetails : [String: Any]
    get
        let defaults        = UserDefaults.standard
        let profileDetailsDict  = defaults.object(forKey: "profileDetails") as? [String: Any] ?? [String : Any]()
        print("Get profileDetailsDict : \(profileDetailsDict), type: \(type(of: profileDetailsDict))")
        return profileDetailsDict
    
    set (profileDetailsDict)
        let defaults        = UserDefaults.standard

        print("Set profileDetailsDict: \(profileDetailsDict)")
        defaults.set(profileDetailsDict, forKey: "profileDetails")
    



let profileDetailsDict = ["availabilityTimesDict": ["Saturday": ["times": [["startTime": 9:00 AM, "endTime": 1:30 PM], ["startTime": 2:30 PM, "endTime": 6:00 PM]], "weekday": Saturday, "available": true], "Tuesday": ["times": [["startTime": 2:30 PM, "endTime": 6:00 PM]], "weekday": Tuesday, "available": true]], "mobileNumber": "8458465845", "namesArray": ["name1", "name2"]] as [String: Any]


// Setting profileDetailsDict
profileDetails =  profileDetailsDict

// Retrieving profileDetailsDict
let userDetails = profileDetails

【问题讨论】:

【参考方案1】:

这很正常。

当一个对象被保存到UserDefaults 时,任何数值都会被桥接到NSNumber 并且truefalseNSNumber 中的表示是10

你会得到真正的truefalse

dict["available"] as! Bool

【讨论】:

以上是关于从 UserDefaults 获得的布尔值打印为 0 或 1,即使保存为 Any的主要内容,如果未能解决你的问题,请参考以下文章

检索 UserDefaults 后在 viewdidload 上刷新 collectionView

当 UserDefaults 值更改 SwiftUI 时,@FetchRequest 谓词不会更新

在c中将布尔结果打印为“假”或“真”的最佳方法?

在c中将布尔结果打印为“假”或“真”的最佳方法?

如何从 UserDefaults 向数组添加值?

从 ResultSet 获取布尔值