如何在swift中检查nil变量并避免应用程序崩溃?

时间:2018-05-08 09:18:10

标签: ios swift swifty-json

我将我的字符串声明为

var firstName = String()

我从解析的JSON内容中分配值,例如

firstName = json["first_name"].stringValue

但有时候,JSON响应中可能有空值而应用程序崩溃了,我读到了关于guard语句和if语句来检查空值,但这需要更改声明格式,无法找到在不改变声明格式的情况下处理此错误的正确方法。

因为我已经在我的应用程序中声明了类似格式的所有变量,更改需要时间,我即将上传我的应用程序,这是我的第一个swift应用程序,如果我的声明格式错误请回答为什么会这样,有人可以帮我解决这个问题吗?

5 个答案:

答案 0 :(得分:3)

Swift 4的代码:

请记住,当您使用" .stringValue"时,它几乎与使用"!"这将迫使一无所事。

    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"

答案 1 :(得分:1)

您也可以使用保护声明,

guard let firstName = json["first_name"] else {
    print("FirstName is Empty")
    return
}

或者您也可以查看,

if let firstName = json["first_name"] {
    //Your code goes here
}

答案 2 :(得分:1)

您可以使用下一个声明:

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 
}

答案 3 :(得分:0)

您可以通过以下方式执行此操作:

if let dictionary = json {
    if let fName = dictionary["first_name"] {
        firstName = fName as? String
    }
}

答案 4 :(得分:0)

我邀请您使用x = float(input("Enter the first number: ")) y = float(input("Enter the second number: ")) z = float(input("Enter the third number: ")) if x >= y and x >= z: maximum = x elif y >= z and y >= x: maximum = y else: maximum = z print("The maximum no. b/w : ", x, ",", y, "and", z, "is", maximum) 。函数SwiftyJSON始终返回stringValue个对象。 String是不可能的。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

}