You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:09:02