【问题标题】:How to Represent Dictionary as NSValue in Swift 3?如何在 Swift 3 中将字典表示为 NSValue?
【发布时间】: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?

【问题讨论】:

    标签: swift foundation nsvalue objective-c-swift-bridge unsafemutablepointer


    【解决方案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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      相关资源
      最近更新 更多