如何在 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) -&gt; 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?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中将字典转换为 JSON

如何在 Alamofire,swift 3 中将字典作为参数发送

我们如何在 swift 2.3 中将值附加到包含 3 个元素的字典中?

在 Swift 3 中将 JSON 字符串转换为字典

如何使用swift在pubnub中将数据发布为Any类型的字典?

如何在 Swift 中将键值对添加到类型为 [String:AnyObject] 的字典中?