0

我有以下字典:

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 呢?

4

2 回答 2

2

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

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

于 2017-01-08T02:08:51.297 回答
1

理论上,如果你真的想把一个 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)

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

于 2017-01-08T03:24:45.630 回答