多层嵌套字典语法疑问:如何用Door数据填充四层嵌套字典?
填充四层嵌套字典的正确Swift语法
我来帮你搞定这个四层嵌套字典的填充问题!首先咱们先明确你的字典结构:[建筑名称: [楼层: [区域范围: [门牌号: Door]]]],这种逐层嵌套的结构需要咱们逐层检查并初始化子字典,避免因为键不存在导致的崩溃或者数据丢失。
第一步:先定义好Door结构体(参考)
首先得确保你的Door类型是可用的,这里给个示例结构体方便后续演示:
struct Door { let building: String let level: String let range: String let number: String // 其他次要信息,比如门的类型、描述等 let doorType: String? }
第二步:单个Door的填充逻辑
假设你已经有一个Door实例,咱们一步步把它塞进doorsMap里:
// 初始化一个示例门数据 let officeDoor = Door( building: "行政楼", level: "3F", range: "东侧区域", number: "305", doorType: "办公室门" ) // 1. 获取当前建筑对应的楼层字典,不存在就创建空字典 var levelDictionary = doorsMap[officeDoor.building] ?? [:] // 2. 获取当前楼层对应的区域字典,不存在就创建空字典 var rangeDictionary = levelDictionary[officeDoor.level] ?? [:] // 3. 获取当前区域对应的门字典,不存在就创建空字典 var doorDictionary = rangeDictionary[officeDoor.range] ?? [:] // 4. 把当前门添加到门字典里,用门牌号作为键 doorDictionary[officeDoor.number] = officeDoor // 5. 把修改后的字典逐层存回上层字典 rangeDictionary[officeDoor.range] = doorDictionary levelDictionary[officeDoor.level] = rangeDictionary doorsMap[officeDoor.building] = levelDictionary
第三步:封装成函数批量处理
如果要导入多个Door,直接写重复代码太麻烦,咱们把逻辑封装成一个函数:
func addDoor(to doorsMap: inout [String : [String : [String : [String: Door]]]], door: Door) { // 逐层获取或初始化子字典 var levelDict = doorsMap[door.building] ?? [:] var rangeDict = levelDict[door.level] ?? [:] var doorDict = rangeDict[door.range] ?? [:] // 添加门数据 doorDict[door.number] = door // 逐层回写 rangeDict[door.range] = doorDict levelDict[door.level] = rangeDict doorsMap[door.building] = levelDict } // 批量使用示例 let doorsToAdd: [Door] = [officeDoor, meetingRoomDoor, stairDoor] for door in doorsToAdd { addDoor(to: &doorsMap, door: door) }
小提示
这种写法的核心是利用??空合运算符,当键不存在时自动创建空字典,避免了强制解包!带来的崩溃风险。后续你要填充三个选择器的时候,就可以逐层读取字典的键:比如第一个选择器读doorsMap.keys(所有建筑),选中建筑后第二个选择器读doorsMap[selectedBuilding]?.keys(该建筑的所有楼层),以此类推。
内容的提问来源于stack exchange,提问作者Emil Adz
相关产品推荐
相关产品推荐

