如何在 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)
当心:这是通往黑暗面的道路。
我有以下词典:
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)
当心:这是通往黑暗面的道路。