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
,其中 Key
是 String
,Value
是 Array
。因此: 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
作为 String
和 Values
作为 Array
的字典?我想保留他们的 Generic
方法。
jsonString 的类型是 Dictionary<String, Array<String>>
你可以给它一个像 Dictionary<String, AnyObject>
这样的类型
AnyObject 可以包含 class 和结构,即 Array
、Dictionary
、String
、Int
、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
我正在尝试解析以下 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
,其中 Key
是 String
,Value
是 Array
。因此: 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
作为 String
和 Values
作为 Array
的字典?我想保留他们的 Generic
方法。
jsonString 的类型是 Dictionary<String, Array<String>>
你可以给它一个像 Dictionary<String, AnyObject>
AnyObject 可以包含 class 和结构,即 Array
、Dictionary
、String
、Int
、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