Swift Userdefaults 将 String 转换为 __NSCFString

Posted

技术标签:

【中文标题】Swift Userdefaults 将 String 转换为 __NSCFString【英文标题】:Swift Userdefaults converting String to __NSCFString 【发布时间】:2020-09-19 06:17:15 【问题描述】:

我的代码可以在UserDefaults 中保存[String: Any] 的字典。检索时,String 更改为 __NSCFString。我正在使用Mixpanel 来跟踪事件并将此字典作为事件属性发送。现在的问题是 __NSCFString 不是有效的 MixpanelType 所以 Mixpanel 正在丢弃我的字典。

问题:

有没有办法获取在 UserDefaults 中使用字典保存的相同数据类型? Mixpanel 有没有办法接受转换后的数据类型?

这是我正在使用的代码

var mixpanelProperties: [String: Any] 
    get  defaults.dictionary(forKey: "\(#function)") ?? [:] 
    set  defaults.set(newValue, forKey: "\(#function)") 


mixpanelProperties = ["a-key": "value for the key"]
let prop = mixpanelProperties
print("Type of: \(String(describing: prop["a-key"]))")

阿斯达德

【问题讨论】:

当您从 UserDefaults 读取字典时,您是否尝试将字典转换为 [String: Any]? 我认为这里不需要强制转换,因为 UserDefaults.dictionary 返回 [String: Any]? 那我理解错了,那么__NSCGString是从哪里来的呢?也许你应该添加一些代码来澄清你的问题。 @JoakimDanielson 我已经编辑了我的问题。请看一看。 目前还不清楚 __NSCGString 来自哪里,我试图在操场上重现但无法做到。 【参考方案1】:

MacOS 和 ios 使用各种不同的类来表示字符串,它们都是兼容的。 x 作为?无论 x 的具体类是什么,字符串都应该可以工作。除非你使用的代码明确地检查你不应该做的类。

【讨论】:

以上是关于Swift Userdefaults 将 String 转换为 __NSCFString的主要内容,如果未能解决你的问题,请参考以下文章

如何将完整的 UserDefaults 列表放入 tableview - Swift 3

Swift 5 将 AVAsset 保存到 UserDefaults

如何使用静态自我实例将模型类保存在 UserDefaults 中?

Swift 3:将数组保存到 UserDefaults 错误 - 对象数与键数不同

Swift 3和UserDefaults

iOS Swift 将领域对象存储到 UserDefaults.standard