我的类可以从 JSON 字典中初始化
class ChildObject {
required init?(fromDictionary dictionary: [String:Any]) { //init... }
}
现在我得到了一系列这样的字典:
// objectDictionaries = [[String:Any]]
现在我想使用 map
初始化我的类的数组。我正在另一个类中初始化一个数组。
class ParentObject {
var children: [ChildObject]
required init?(fromDictionary aDictionary: [String:Any]) {
guard let childDictionaries = aDictionary["children"] as? [[String:Any]],
let children = childDictionaries.map { ChildObject(fromDictionary: $0) }
else { return nil }
self.children = children
}
}
但这不能编译---谁能告诉我正确的语法?我尝试了 forEach
但这也没有用。
在 Playground 上我得到
- 在 guard 之后期望其他
- 匿名闭包参数不包含在 关闭
- 预期的表达方式
- 未使用的大括号语句 block 关闭
最佳答案
map
不返回可选项,所以 let children = childDictionaries.map { ChildObject(fromDictionary: $0) }
不能在你的保护子句中。
另一方面,ChildObject(fromDictionary: $0)
确实返回一个可选的,这是 map
不支持的。
您可以使用flatMap
,这样无法初始化的值将被忽略:
class ParentObject {
let children: [ChildObject]
required init?(fromDictionary aDictionary: [String:Any]) {
guard let childDictionaries = aDictionary["children"] as? [[String:Any]],
else { return nil }
self.children = childDictionaries.flatMap { ChildObject(fromDictionary: $0) }
}
}
如果必须正确初始化所有子项,您也可以返回 nil:
required init?(fromDictionary aDictionary: [String:Any]) {
guard let childDictionaries = aDictionary["children"] as? [[String:Any]]
else { return nil }
let children = childDictionaries.flatMap { ChildObject(fromDictionary: $0) }
guard children.count == childDictionaries.count else { return nil }
self.children = children
}
关于ios - 使用 map() 从字典数组(即 JSON 数组)初始化数组内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43992985/