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

Swift中检查变量nil避免崩溃:不改声明处理JSON空值

解决方案:无需修改变量声明的JSON空值处理方式

这个场景我太熟悉了——已经写了一大堆非可选变量,总不能挨个改成可选类型吧?给你几个不用动变量声明的安全处理方案:

1. 空合运算符快速兜底(最简单直接)

你原来的json["first_name"].stringValue会崩溃,核心是字段为空时stringValue无法返回合法字符串。我们可以用??空合运算符,在取值失败时自动返回空字符串(和你变量的初始值一致):

如果你用SwiftyJSON:

原来的危险代码:

var firstName = String()
firstName = json["first_name"].stringValue // 空值时崩溃

改成安全版:

var firstName = String()
firstName = json["first_name"].string ?? "" // 空值自动取空字符串

json["first_name"].string会返回可选类型String?,字段不存在或为null时返回nil,?? ""会把nil替换成空字符串,完全适配你已有的非可选变量类型。

如果你用原生Foundation解析:

原来的危险代码:

var firstName = String()
let json = try JSONSerialization.jsonObject(with: data) as! [String: Any]
firstName = json["first_name"] as! String // 空值时崩溃

改成安全版:

var firstName = String()
let json = try JSONSerialization.jsonObject(with: data) as! [String: Any]
firstName = (json["first_name"] as? String) ?? "" // 空值自动取空字符串

as? String会安全尝试类型转换,失败时返回nil,同样用?? ""兜底。

2. 封装扩展减少重复代码(适合大量变量场景)

如果有几十上百个这种变量,重复写?? ""太繁琐,可以给JSON库或字典写个扩展统一处理:

SwiftyJSON扩展示例:

import SwiftyJSON

extension JSON {
    // 自定义安全字符串属性,空值返回空字符串
    var safeString: String {
        return self.string ?? ""
    }
}

之后所有变量赋值只需替换成:

var firstName = String()
firstName = json["first_name"].safeString

var lastName = String()
lastName = json["last_name"].safeString
// ... 其他变量同理

原生字典扩展示例:

extension Dictionary where Key == String, Value: Any {
    // 安全获取字符串,空值返回空字符串
    func safeString(forKey key: String) -> String {
        return self[key] as? String ?? ""
    }
}

之后赋值时:

var firstName = String()
firstName = json.safeString(forKey: "first_name")

var lastName = String()
lastName = json.safeString(forKey: "last_name")

为什么不用改变量声明?

你的变量是var firstName = String()(非可选的空字符串),而我们的取值逻辑最终返回的都是非可选String类型(要么是解析到的有效字符串,要么是空字符串),完全匹配变量的类型要求,所以不需要修改任何已有的变量声明。

内容的提问来源于stack exchange,提问作者swiftDevStart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:08:56