Как проверить nil для переменных в swift и избежать сбоев приложения? - PullRequest
0 голосов
/ 08 мая 2018

Моя строка объявлена ​​как,

var firstName = String()

и я присваиваю значение из проанализированного содержимого JSON, например,

firstName = json["first_name"].stringValue

Но иногда в ответе JSON могут быть пустые значения, и происходит сбой приложения, я читал об операторе guard и операторе для проверки пустых значений, но для этого требуется изменить формат объявления, но не смог найти нужного способ справиться с этой ошибкой без изменения формата объявления.

так как я объявил все переменные в моем приложении с одинаковыми форматами, изменение которых требует времени, я нахожусь на грани загрузки моего приложения, это мое первое быстрое приложение, если мой формат объявления неверен, пожалуйста, ответьте, почему это есть, кто-нибудь может мне помочь из этого?

Ответы [ 5 ]

0 голосов
/ 08 мая 2018

Я гость, вы используете 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

}
0 голосов
/ 08 мая 2018

Код от Swift 4:

Имейте в виду, что когда вы используете ".stringValue", это почти то же самое, что и "!" что приведет к краху на ноль.

    if let firstName = json["first_name"]as? String {
        //do stuff like
        self.firstName = firstName
    }

Это развернет его там, где вы можете получить значение, если оно не равно нулю и может быть строкой.

Охранник, давайте действительно хорош для этого, так как вы можете учесть это в начале, и вы можете предположить, что это не является обязательным для всей области.

    guard let firstName = json["first_name"]as? String else {return}
    self.firstName = firstName

Кроме того, вы всегда можете проверить наличие нулей в одной строке и назначить значение по умолчанию, если значение равно nil.

    self.firstName = (json["first_name"]as? String) ?? "Default String"
0 голосов
/ 08 мая 2018

Вы также можете использовать охранное заявление,

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

или вы можете проверить, если также,

if let firstName = json["first_name"] {
    //Your code goes here
}
0 голосов
/ 08 мая 2018

Вы можете использовать следующее утверждение:

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 
}
0 голосов
/ 08 мая 2018

Вы можете сделать это следующим образом:

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