如何检查 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

}