gpt4 book ai didi

ios - 使用 map() 从字典数组(即 JSON 数组)初始化数组内联

转载 作者:行者123 更新时间:2023-11-28 10:13:58 26 4
gpt4 key购买 nike

我的类可以从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com