Ios Swift:如何将[String:Any]数组转换为特定数组
我有一个简单的结构:Ios Swift:如何将[String:Any]数组转换为特定数组,ios,arrays,swift,casting,Ios,Arrays,Swift,Casting,我有一个简单的结构: protocol DocumentSerializable { init?(dictionary:[String:Any]) } struct Item { var title:String var text:String? var dictionary:[String:Any] { return [ "title":title, "text":text, ]
protocol DocumentSerializable {
init?(dictionary:[String:Any])
}
struct Item {
var title:String
var text:String?
var dictionary:[String:Any] {
return [
"title":title,
"text":text,
]
}
}
extension Item : DocumentSerializable {
init?(dictionary: [String : Any]) {
guard let title = dictionary["title"] as? String,
let text = dictionary["text"] as? String? else {return nil}
self.init(title: title, text: text)
}
}
当我收到我的json时,我把它放在一个数组中
if let array = result?.data as? Array<[String:Any]> {...
如果let array=result?。数据为?数组{。。。
如何将此数组转换为项目数组?var itemsArray=[Item]()
这两个数组的结构完全相同
感谢使用
compactMap
,它还处理nil
情况:
itemsArray = array.compactMap{ Item(dictionary: $0) }
但是,在Swift 4中,强烈建议使用Codable
协议
struct Item :Decodable {
let title:String
let text:String?
}
//
您使用“Casting”标记,但显然,不要误解它的作用。相反,请执行循环并使用字典在相应索引处初始化每个项。或者使用更“快速”的代码,如
itemsArray=array.map({Item.init(dictionary:$0)})
谢谢,但它不起作用。它返回一个空数组如果让测试,你是否通过了测试?你确定结果。数据是一个字典数组?结果中有什么?数据
?数组的打印是:[[“title”:一个标题,“text”:一个文本],“title”:一个标题,“text”:一个文本],“title”:一个标题,“text”:一个文本]]应该是这样的[[“标题”:“22222”,“文本”:“Weewewew”],[“标题”:“22222”,“文本”:“Weewewew”]]谢谢,但它不起作用。如果您的代码通过了测试(如果let
测试成功),并且包含带有标题
和文本
键的词典,则返回空数组。我已简化了此处的属性,以使代码更具可读性。所有必需属性(标题)从服务器上找我。可选属性不是全部。这就是问题所在?根据代码,初始值设定项仅在所有密钥都可用时创建对象。谢谢,现在我将尝试使用所有属性
do {
let root = try JSONDecoder().decode([Item].self, from:jsonData)
print(root)
}
catch {
print(error)
}