如何在 Swift 3 中将字典表示为 NSValue?

How to Represent Dictionary as NSValue in Swift 3?

我有以下词典:

let example: [String: (Int, Int)] = ["test": (0, 1)]

我需要将其存储为 NSData 变量,为此必须首先将其转换为 NSValue,我尝试按如下方式进行:

let nsval = NSValue().getValue(example as! UnsafeMutableRawPointer)

只遇到错误:

Cannot convert value of type 'Void' (aka '()') to specified type 'NSValue'

我看到了建议使用的答案:

let test = UnsafeMutablePointer.load(example)

但这也会产生错误:

Type 'UnsafeMutablePointer<_>' has no member 'load'

那么,如何在Swift 3中将字典转换为NSValue?

并非所有 swift 类型都与 Foundation 类 兼容。所以你不能构造一个包含 [String: (Int, Int)] 类型的 NSValue ,但是从 NSDictionary 开始。放弃元组并选择与 objc 兼容的类型。那么您可以将 let example: 的类型更改为 NSDictionary。将其与 NSValue 方法一起使用。

就是说,如果您尝试将一般 objc 类型转换为 NSData 以用于一般序列化目的,您将从 NSKeyedArchiver/NSKeyedUnarchiver 方法中获得更多收益,例如.archivedData(withRootObject: Any) -> Data(尽管他们仍然不支持元组。)

理论上,如果你真的想把一个 swift 元组变成一个数据对象,你可以这样做。

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)

当心:这是通往黑暗面的道路。