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
相关产品推荐
相关产品推荐

