Swift: flatMap 到字典

Swift: flatMap to Dictionary

我正在尝试解析以下 JSON:

{ 
  "String For Key 1": [
    "Some String A",
    "Some String B",
    "Some String C",
  ],
  "String For Key 2": [
    "Some String D",
    "Some String E",
    "Some String F"
  ],
  "String For Key 3": [
    "Some String G",
    "Some String H",
    "Some String I",
  ],
  "String For Key 4": [
    "Some String J",
    "Some String K",
    "Some String L"
  ],
  "String For Key 5": [
    "Some String M",
    "Some String N",
    "Some String O"
  ],
  "String For Key 6": [
    "Some String P",
    "Some String Q",
    "Some String R"
  ]
}

我也在关注这个tutorial。在 Playground

中 Github

在示例中,他们正在使用 typealias JSONDictionary = [String: AnyObject]

解析 Array 个词典

我需要解析 Dictionary,其中 KeyStringValueArray。因此: typealias JSONDictionary = [String: [AnyObject]] 并且在返回 flatMap.

时出现错误
extension Resource {
    init(url: NSURL, parseJSON: AnyObject -> A?) {
        self.url = url
        self.parse = { data in
            let json = try? NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String: [AnyObject]]
           //This is where I get an error
            return json.flatMap(parseJSON)
        }
    }
}

错误:

Cannot convert value of type `AnyObject -> A? to expected argument type `([String: [AnyObject]]?) -> _?

我怎样才能得到一个 Keys 作为 StringValues 作为 Array 的字典?我想保留他们的 Generic 方法。

jsonString 的类型是 Dictionary<String, Array<String>> 你可以给它一个像 Dictionary<String, AnyObject>

这样的类型

AnyObject 可以包含 class 和结构,即 ArrayDictionaryStringInt、Obj C 类 因此 Array<String> 表示为 AnyObject not [AnyObject]

let jsonString:[String: AnyObject] =
[
    "String For Key 1": [
    "http://www.urlToSomePathA.jpg",
    "http://www.urlToSomePathB.jpg",
    "http://www.urlToSomePathC.jpg",
    ],
    "String For Key 2": [
    "http://www.urlToSomePathD.jpg",
    "http://www.urlToSomePathE.jpg",
    "http://www.urlToSomePathF.jpg"
    ]
]

// Now you can map a function on the value type
let values = jsonString.flatMap { [=10=].1 as? [String] }
print(values)
// RESULT: [["http://www.urlToSomePathA.jpg", "http://www.urlToSomePathB.jpg", "http://www.urlToSomePathC.jpg"], ["http://www.urlToSomePathD.jpg", "http://www.urlToSomePathE.jpg", "http://www.urlToSomePathF.jpg"]]

更新

let keys = jsonString.flatMap { [=11=].0 } // ["String For Key 1", "String For Key 2"]

正如@dffri 所评论的,您可以在字典上使用键 属性,这将 return LazyMapCollection 只有当您访问内部对象时才会实现。

let keys = jsonString.keys