Swif4.0以便捷的方式访问字典数组

时间:2019-03-13 20:15:11

标签: arrays swift dictionary

我才刚刚开始学习Swift,也是ios开发的新手。

var bookArray:[String:[[String:String]]] = ["book1":[["bookid":"SCIENCE","viewed":"12"],["bookid":"MATHS","viewed":"25"]],"book2":[["bookid":"HISTORY","viewed":"10"]]]

我将获得输入作为外部字典键和内部字典键,需要检查和更新字典。

(即)

  1. 如果给定的外部字典键为“ book1”,内部字典键为“ MATHS”,则所需输出为

    bookArray:[String:[[String:String]]] = ["book1":[["bookid":"SCIENCE","viewed":"12"],["bookid":"MATHS","viewed":"26"]],"book2":[["bookid":"HISTORY","viewed":"10"]]]
    

    (观看次数增加)

  2. 如果给定的外部字典键为“ book1”,内部字典键为“ CHEMISTRY”,则所需输出为

    bookArray:[String:[[String:String]]] = ["book1":[["bookid":"SCIENCE","viewed":"12"],["bookid":"MATHS","viewed":"25"],["bookid":"CHEMISTRY","viewed":"0"]],"book2":[["bookid":"HISTORY","viewed":"10"]]]
    

    (要为给定的外键添加新的Bookid,且查看计数为零)

我开始工作,但是for循环有很多并发症,而且混乱太多...

有人可以建议我更好的方法来完成结果吗?

2 个答案:

答案 0 :(得分:0)

我建议为Book创建一个结构

struct Book {
   let bookID: String
   let viewed: Int
}

并保存一个数组。将更易于管理。

您的数组将更改为:

var bookArray: [String:Book] = [Book(bookID: "SCIENCE", viewed: 12)] 

您可以创建更多图书并将其添加到数组中

答案 1 :(得分:0)

也许以下代码可以帮助您获得最终答案。

 var myDict : [String:[[String: String]]] = [:]

 myDict = ["book1": [["bookid":"SCIENCE","viewed":"12"],  ["bookid":"MATHS","viewed":"25"]], "book2":[["bookid":"HISTORY","viewed": "10"]]]


func updateKey(_ outKey: String, _ innerKey: String){

var array = myDict[outKey] ?? []


if let index = array.firstIndex(where: {$0["bookid"] == innerKey}){
array[index]["viewed"] =  "\(Int(array[index]["viewed"]!)! + 1)"
}
else {
array += [["bookid":innerKey,"viewed":"0"]]
}

myDict[outKey] = array
}

 updateKey("book1", "MATHS")
 print(myDict)

 // ["book2": [["viewed": "10", "bookid": "HISTORY"]], "book1": [["viewed": "12", "bookid": "SCIENCE"], ["viewed": "26", "bookid": "MATHS"]]]

 updateKey("book1", "CHEMISTRY")
 print(myDict)

 //["book2": [["viewed": "10", "bookid": "HISTORY"]], "book1": [["viewed": "12", "bookid": "SCIENCE"], ["viewed": "26", "bookid": "MATHS"], ["viewed": "0", "bookid": "CHEMISTRY"]]]