Swift字符串拼接避免nil及Optional标记 从对象生成查询字符串
问题原因
Optional类型直接转为字符串时会自带Optional(xxx)格式标记,值为nil的可选值转字符串会直接输出nil,你没有对可选值做解包处理就直接拼接,才会出现不符合预期的结果。
解决方案
可以先实现一个通用的任意类型解包方法,对Optional类型做自动解包,nil统一返回空字符串,非nil返回实际值:
func unwrap(_ any: Any) -> Any { let mirror = Mirror(reflecting: any) // 非Optional类型直接返回原值 guard mirror.displayStyle == .optional else { return any } // Optional为nil时返回空字符串 guard let child = mirror.children.first else { return "" } // 递归解包嵌套的Optional(如果存在) return unwrap(child.value) }
你可以选择在两个位置插入解包逻辑,任选其一即可:
方案1:修改toDict方法,存入字典前先解包
func toDict() -> [String:Any] { var dict = [String:Any]() let otherSelf = Mirror(reflecting: self) for child in otherSelf.children { if let key = child.label { dict[key] = unwrap(child.value) } } return dict }
方案2:修改queryString计算属性,拼接前解包值
var queryString: String { var output: String = "" for (key,value) in toDict() { let unwrappedValue = unwrap(value) output += "\(key)=\(unwrappedValue)&" } output = String(output.dropLast()) return output }
修改后生成的查询字符串就会符合你的预期,没有nil和Optional标记。如果后续你需要将nil对应的参数直接省略不拼接,只需要在解包判断为nil时跳过拼接逻辑即可。
内容的提问来源于stack exchange,提问作者odin_123
相关产品推荐
相关产品推荐

