【问题标题】:Apparent inconsistency in the type declaration of `JSONSerialization.data``JSONSerialization.data` 的类型声明明显不一致
【发布时间】:2017-04-30 08:36:53
【问题描述】:

这是JSONSerialization.data的类型签名:

class func data(withJSONObject obj: Any, options opt: JSONSerialization.WritingOptions = []) throws -> Data

奇怪的是JSONSerialization.WritingOptions 是一个结构体,而默认值 [] 是一个数组,而不是一个匹配项。有什么问题吗?

【问题讨论】:

    标签: swift types swift3


    【解决方案1】:

    JSONSerialization.WritingOptions符合OptionSet协议,继承自SetAlgebra,又继承自ExpressibleByArrayLiteral

    因此,您可以从(可能为空的)数组 literal 创建一个 JSONSerialization.WritingOptions 值(使用 init(arrayLiteral elements: Self.Element...) 初始化器):

    JSONSerialization.data(withJSONObject: obj, options: [])
    JSONSerialization.data(withJSONObject: obj, options: [.prettyPrinted])
    

    阅读选项也是如此(超过 一个可能的值),例如:

    JSONSerialization.jsonObject(with: json, options: [.allowFragments, .mutableLeaves])
    

    和许多其他OptionSet 类型。

    另外,OptionSet 继承自 RawRepresentable 整数 RawValue。表示每个可能的值 作为一个整数,零位、一位或多位设置为一。

    但请注意,以上示例中的[][.prettyPrinted] 是 数组 literals(从中创建 JSONSerialization.WritingOptions 值),而不是数组。这不会编译:

    let noOptions = Array<JSONSerialization.WritingOptions>()
    let json = try! JSONSerialization.data(withJSONObject: obj, options: noOptions)
    // cannot convert value of type 'Array<JSONSerialization.WritingOptions>' to expected argument type 'JSONSerialization.WritingOptions'
    

    【讨论】:

    • 似乎还是不对。 .prettyPrinted 已经属于JSONSerialization.WritingOptions 类型,[.prettyPrinted] 怎么可能符合相同类型?
    • @qed: OptionSetType 定义了associatedtype Element = Self 这意味着(如果我理解正确的话),相同的类型用于集合和集合的单个元素。 – 另外[.prettyPrinted] 是一个数组literal,而不是一个数组。
    • 好的,那么.allowFragments.mutableLeaves[.allowFragments, .mutableLeaves] 都属于同一类型?这种奇怪现象背后的原因是什么?我在想为什么 AppCode 不能正确地自动完成这种参数,现在我明白了......
    • @qed:是的。它们都存储为整数rawValue,其中一位或多位设置为1。
    • 啊,好的。我明白了,为了节省空间。
    【解决方案2】:

    Swift 4:这行得通!

    JSONSerialization.data(withJSONObject: data, options: [])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多