繁体   English   中英

如何在Swift 3中将Dictionary表示为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)

只遇到错误:

无法将'Void'类型的值(aka'()')转换为指定的'NSValue'类型

我已经看到建议使用的答案:

let test = UnsafeMutablePointer.load(example)

但这也会产生错误:

类型'UnsafeMutablePointer <_>'没有成员'load'

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

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

就是说,如果您试图将常规objc类型转换为NSData进行常规序列化,那么您将可以从NSKeyedArchiver / NSKeyedUnarchiver方法(例如.archivedData(withRootObject: Any) -> Data获得更多好处。仍然不支持元组。)

从理论上讲,如果您真的想将一个快速的元组转换为数据对象,则可以这样做。

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM