如何从Values[String: Any]字典的值创建新字典以获取location值
解决方案:将嵌套字典转换为直接映射location的字典
这事儿其实挺简单的,用 Swift 自带的mapValues方法就能轻松搞定——它专门用来处理这种「保留原字典的key,只转换对应value」的场景,完美匹配你的需求!
完整代码示例
// 你的原始字典(修正了原JSON的语法问题,location键需要加引号) let originalDict: [String: Any] = [ "SKzSjdBuOpO49wkPVaxtmLQoR0O2": ["location": "-LB1fn5GQKTaIc-fGNPS"], "s0ntSZP7mBQw1a8ua0E5PqazlqJ2": ["location": "-LB23izD7bp2NhO0UuIo"], "FEScjelpNSR7vuVz1ha6Z6uSfF43": ["location": "-LB1JLABuJO1NyJ-v2t_"], "mW7dGja6cRRB0d9uSIhg4f35PzC3": ["location": "-LB5xqUvIjEgtW_FH_nG"], "GCnt0VKcqjT8bl2chw43nsntaZK2": ["location": "-LB1n8ga9C0vCcZXD2Us"] ] // 转换为直接通过key获取location的新字典 let locationDict: [String: String] = originalDict.mapValues { rawValue in // 先把Any类型的value安全转换为嵌套字典,再取出location字段 (rawValue as? [String: Any])?["location"] as? String ?? "Unknown Location" } // 测试访问效果 if let targetLocation = locationDict["SKzSjdBuOpO49wkPVaxtmLQoR0O2"] { print("目标location:\(targetLocation)") // 输出:目标location:-LB1fn5GQKTaIc-fGNPS }
关键细节说明
mapValues会遍历原字典的每一对key-value,保留key不变,只对value做转换操作,比手动写循环简洁太多。- 因为原字典的value是
Any类型,所以必须做安全类型转换:先用as? [String: Any]把value转成嵌套字典,再用可选链?["location"]取出location值,最后再转成String类型。 - 末尾的
?? "Unknown Location"是兜底逻辑——如果某个key对应的value里没有location字段,或者类型不匹配,就会用这个默认值,避免程序崩溃。
如果你的场景能100%保证所有嵌套字典都有location且是字符串,也可以用强制解包,但强烈不推荐——万一数据格式有变化,很容易引发运行时错误。
内容的提问来源于stack exchange,提问作者Ruslan Pitula
相关产品推荐
相关产品推荐

