如何从[String: Any?]字典中优雅提取String类型值?
解决
[String: Any?]字典中提取String?类型值的最优方案 你需要的效果可以通过一行简洁代码实现,完全满足键不存在、值为nil或值非String时返回nil的要求:
let found: String? = annoying["height"] as? String
原理说明
annoying["height"]的返回类型是Any??(双层可选):- 键
"height"不存在时,返回外层nil; - 键存在但对应值是
nil时,返回.some(nil)(内层nil); - 键存在且值为非String类型时,返回
.some(非String值)。
- 键
as? String会自动处理所有情况:无论外层/内层是nil,或者值无法转为String,最终都会返回String?类型的nil;只有当值是有效String时,才会返回对应的可选字符串。
复用优化(可选)
如果需要多次从这类字典中提取字符串,可以给字典写个扩展方法,让代码更易读:
extension Dictionary where Key == String, Value == Any? { func string(forKey key: Key) -> String? { return self[key] as? String } } // 调用方式 let height = annoying.string(forKey: "height")
内容的提问来源于stack exchange,提问作者Fattie
相关产品推荐
相关产品推荐

