【问题标题】:JSONSerialization with value types具有值类型的 JSONSerialization
【发布时间】:2016-07-30 06:15:13
【问题描述】:

我想使用 Foundation 的 JSONSerialization.data(withJSONObject obj: AnyObject, options opt: WritingOptions = []) throws -> Data 。但是,我无法弄清楚如何将我的值类型转换为适合该方法的引用类型。

例如,尝试序列化一个简单的 String 数组会失败,因为该方法需要引用类型,而不是值类型:

root@1c6c66df21cf:/tmp# swift
Welcome to Swift version 3.0 (swift-3.0-PREVIEW-3). Type :help for assistance.
  1> import Foundation
  2> JSONSerialization.data( withJSONObject: [String]() )
error: repl.swift:2:48: error: argument type '[String]' does not conform to expected type 'AnyObject'
JSONSerialization.data( withJSONObject: [String]() )

铸造不起作用:

root@1c6c66df21cf:/tmp# swift
Welcome to Swift version 3.0 (swift-3.0-PREVIEW-3). Type :help for assistance.
  1> import Foundation
  2> let value = [String]()
value: [String] = 0 values
  3> let reference = value as! NSArray
reference: Foundation.NSArray = <extracting data from value failed>

Execution interrupted. Enter code to recover and continue.
Enter LLDB commands to investigate (type :help for assistance.)

我还尝试按照该版本核心 Foundation 的 unit tests 中的示例:

root@1c6c66df21cf:/tmp# swift
Welcome to Swift version 3.0 (swift-3.0-PREVIEW-3). Type :help for assistance.
  1> import Foundation
  2> let value = [String]()
value: [String] = 0 values
  3> let reference = value.bridge()
reference: Foundation.NSArray = <extracting data from value failed>

error: Couldn't lookup symbols:
  (extension in Foundation):Swift.Array.bridge () -> Foundation.NSArray

系统信息供参考:

root@1c6c66df21cf:/tmp# uname -a
Linux 1c6c66df21cf 4.4.12-boot2docker #1 SMP Wed Jun 1 22:45:59 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
root@1c6c66df21cf:/tmp# swift --version
Swift version 3.0 (swift-3.0-PREVIEW-3)
Target: x86_64-unknown-linux-gnu

【问题讨论】:

    标签: json swift swift3


    【解决方案1】:

    使用.bridge() 是正确的方法。该错误特定于 REPL。编译整个文件时不会发生这种情况:

    root@1c6c66df21cf:/tmp# cat test.swift 
    import Foundation
    
    let value = ["string"]
    let reference = value.bridge()
    let jsonData = try! JSONSerialization.data(withJSONObject: reference)
    print(String(data: jsonData, encoding: .utf8)!)
    root@1c6c66df21cf:/tmp# swift test.swift
    ["string"]
    root@1c6c66df21cf:/tmp# swiftc -o test test.swift 
    root@1c6c66df21cf:/tmp# ./test
    ["string"]
    

    【讨论】:

      猜你喜欢
      • 2018-11-02
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 2017-07-14
      相关资源
      最近更新 更多