如何在 Swift 3 中将字典表示为 NSValue?
Posted
技术标签:
【中文标题】如何在 Swift 3 中将字典表示为 NSValue?【英文标题】:How to Represent Dictionary as NSValue in Swift 3? 【发布时间】:2017-01-08 01:46:18 【问题描述】:我有以下字典:
let example: [String: (Int, Int)] = ["test": (0, 1)]
我需要将其存储为 NSData 变量,为此必须首先将其转换为 NSValue,我尝试按以下方式进行操作:
let nsval = NSValue().getValue(example as! UnsafeMutableRawPointer)
只遇到错误:
无法将类型“Void”(又名“()”)的值转换为指定类型“NSValue”
我已经看到建议使用的 SO 答案:
let test = UnsafeMutablePointer.load(example)
但这也会产生错误:
类型'UnsafeMutablePointer<_>'没有成员'load'
那么,如何在 Swift 3 中将字典转换为 NSValue?
【问题讨论】:
【参考方案1】:并非所有 swift 类型都与 Foundation 类兼容。所以你不能构造一个包含 [String: (Int, Int)]
类型的 NSValue,但是你可以从一个 NSDictionary 开始。抛弃元组并选择与 objc 兼容的类型。然后您可以将let example:
的类型更改为NSDictionary。将其与 NSValue 方法一起使用。
也就是说,如果您尝试将通用 objc 类型转换为 NSData 以用于通用序列化目的,您将从NSKeyedArchiver
/NSKeyedUnarchiver
方法中获得更多信息,例如.archivedData(withRootObject: Any) -> Data
(尽管它们仍然不支持元组。)
【讨论】:
那么绝对没有办法将元组存储在 NSUbiquitousKeyValueStore 中? 代码示例太长,见第二个答案【参考方案2】:理论上,如果你真的想把一个 swift Tuple 变成一个数据对象,你可以这样做。
var x:(Int, Int) = (4, 2)
var bytes:Data = withUnsafeBytes(of: &x) g in
var d = Data()
for x in g
d.append(x)
return d
反过来:
var y:(Int, Int) = (0,0)
bytes.withUnsafeBytes (x:UnsafePointer<(Int, Int)>) in
y = x.pointee
print(y) // prints (4, 2)
小心:这是通往黑暗面的道路。
【讨论】:
以上是关于如何在 Swift 3 中将字典表示为 NSValue?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Alamofire,swift 3 中将字典作为参数发送
我们如何在 swift 2.3 中将值附加到包含 3 个元素的字典中?