Swift:修改groupingDict中数组内Jack的drink属性值
修改Swift分组字典中Jack的drink属性值
原代码里用Dictionary(grouping:)生成的groupingDict是[String?: [User]]类型——因为User.name是可选字符串,而且User是值类型的结构体,所以直接修改数组里的元素需要先取出实例、修改后再替换回去。下面给出两种可行的修改方式:
方法一:直接定位修改
通过key快速找到Jack对应的用户数组,修改后重新赋值回字典:
// 取出Jack对应的用户数组(可变副本) if var jackUsers = groupingDict["Jack"] { // 遍历数组找到Jack的实例(按name分组后数组里应该只有一个Jack) for index in jackUsers.indices { if jackUsers[index].name == "Jack" { // 结构体是值类型,必须创建可变副本修改属性 var updatedJack = jackUsers[index] updatedJack.drink = "Soda" jackUsers[index] = updatedJack break // 找到目标后直接退出循环 } } // 将修改后的数组放回字典 groupingDict["Jack"] = jackUsers }
方法二:遍历字典批量处理
替换你原来的for循环代码,遍历字典时针对性修改:
for (key, var users) in groupingDict { if key == "Jack" { // 用map生成修改后的用户数组 users = users.map { user in var mutableUser = user if mutableUser.name == "Jack" { mutableUser.drink = "Soda" } return mutableUser } // 把修改后的数组赋值回字典 groupingDict[key] = users } }
补充说明
- 因为
User是结构体(值类型),无法直接修改数组中元素的属性,必须先创建可变副本,修改后再替换原位置的元素。 Dictionary(grouping:)生成的字典值是数组,每个key对应一组同name的用户,示例中每个name仅对应一个用户,所以找到匹配项后即可停止操作。
内容的提问来源于stack exchange,提问作者Lance Samaria
相关产品推荐
相关产品推荐

