如何检查 swift 中的变量是否为 nil 并避免应用程序崩溃?
How to check nil for variables in swift and avoid app crashing?
我将我的字符串声明为,
var firstName = String()
我正在从解析的 JSON 内容中分配值,例如,
firstName = json["first_name"].stringValue
但有时,JSON 响应中可能有空值,应用程序崩溃,我阅读了 guard 语句和 if 语句来检查空值,但这需要更改声明格式,在不更改声明格式的情况下找不到正确的方法来处理此错误。
因为我已经在我的应用程序中声明了所有具有相似格式的变量,更改需要时间,我正处于上传我的应用程序的边缘,这是我的第一个 swift 应用程序,如果我的声明格式错了请回答为什么,有人可以帮我解决这个问题吗?
您可以通过以下方式进行:
if let dictionary = json {
if let fName = dictionary["first_name"] {
firstName = fName as? String
}
}
你也可以使用 guard 语句,
guard let firstName = json["first_name"] else {
print("FirstName is Empty")
return
}
或者你也可以检查一下,
if let firstName = json["first_name"] {
//Your code goes here
}
您可以使用下一条语句:
guard let firstName = json["first_name"].stringValue else { // Do sth if nil }
// Do sth if not nil
或者你可以使用你写的语句,但是你应该检查变量
firstName
像这样:
guard firstName != nil else { // Do sth if nil }
// Do sth if not nil
或者
if firstName != nil {
// Do sth if not nil
}
截至 Swift 4 的代码:
请记住,当您使用“.stringValue”时,它几乎与使用“!”相同。这将导致 nil 崩溃。
if let firstName = json["first_name"]as? String {
//do stuff like
self.firstName = firstName
}
如果它不为 null 并且可以是字符串,这会将其解包到您可以获得值的位置。
Guard let 对此非常有用,因为您可以在一开始就考虑到它,并且您可以假设它在整个范围内都不是可选的。
guard let firstName = json["first_name"]as? String else {return}
self.firstName = firstName
此外,您始终可以在一行中检查空值并在出现空值时分配默认值。
self.firstName = (json["first_name"]as? String) ?? "Default String"
我请你使用SwiftyJSON
。函数stringValue
总是returnString
对象。不可能是nil
。这听起来像是 无效 JSON 格式 的响应数据,所以它崩溃了。
我的代码段。
// Alarmofire + SwiftyJSON
let request: DataRequest = ...//< Configure Alarmofire DataRequest
request.response() { (resp) in
if let error = resp.error {
// TODO: Error handle
return
}
if (response.data == nil) {
// TODO: error handle for empty data?
return
}
assert(response.data != nil, "In this place, the `data` MUST not be nil.")
let json = try? JSON(data: response.data!)
if (json == nil) {
// TODO: Error handle for invalid JSON format.
// If json is nil, then `json["first_name"]` will lead to crash.
return
}
// TODO: parse json object
let firstNameStr = json["first_name"].stringValue
}
我将我的字符串声明为,
var firstName = String()
我正在从解析的 JSON 内容中分配值,例如,
firstName = json["first_name"].stringValue
但有时,JSON 响应中可能有空值,应用程序崩溃,我阅读了 guard 语句和 if 语句来检查空值,但这需要更改声明格式,在不更改声明格式的情况下找不到正确的方法来处理此错误。
因为我已经在我的应用程序中声明了所有具有相似格式的变量,更改需要时间,我正处于上传我的应用程序的边缘,这是我的第一个 swift 应用程序,如果我的声明格式错了请回答为什么,有人可以帮我解决这个问题吗?
您可以通过以下方式进行:
if let dictionary = json {
if let fName = dictionary["first_name"] {
firstName = fName as? String
}
}
你也可以使用 guard 语句,
guard let firstName = json["first_name"] else {
print("FirstName is Empty")
return
}
或者你也可以检查一下,
if let firstName = json["first_name"] {
//Your code goes here
}
您可以使用下一条语句:
guard let firstName = json["first_name"].stringValue else { // Do sth if nil }
// Do sth if not nil
或者你可以使用你写的语句,但是你应该检查变量
firstName
像这样:
guard firstName != nil else { // Do sth if nil }
// Do sth if not nil
或者
if firstName != nil {
// Do sth if not nil
}
截至 Swift 4 的代码:
请记住,当您使用“.stringValue”时,它几乎与使用“!”相同。这将导致 nil 崩溃。
if let firstName = json["first_name"]as? String {
//do stuff like
self.firstName = firstName
}
如果它不为 null 并且可以是字符串,这会将其解包到您可以获得值的位置。
Guard let 对此非常有用,因为您可以在一开始就考虑到它,并且您可以假设它在整个范围内都不是可选的。
guard let firstName = json["first_name"]as? String else {return}
self.firstName = firstName
此外,您始终可以在一行中检查空值并在出现空值时分配默认值。
self.firstName = (json["first_name"]as? String) ?? "Default String"
我请你使用SwiftyJSON
。函数stringValue
总是returnString
对象。不可能是nil
。这听起来像是 无效 JSON 格式 的响应数据,所以它崩溃了。
我的代码段。
// Alarmofire + SwiftyJSON
let request: DataRequest = ...//< Configure Alarmofire DataRequest
request.response() { (resp) in
if let error = resp.error {
// TODO: Error handle
return
}
if (response.data == nil) {
// TODO: error handle for empty data?
return
}
assert(response.data != nil, "In this place, the `data` MUST not be nil.")
let json = try? JSON(data: response.data!)
if (json == nil) {
// TODO: Error handle for invalid JSON format.
// If json is nil, then `json["first_name"]` will lead to crash.
return
}
// TODO: parse json object
let firstNameStr = json["first_name"].stringValue
}