在swift中将Any转换为Int时的EXC_BAD指令

时间:2017-05-16 19:30:50

标签: json swift int

我的json对象是这样的

["Success": 0, "Message": Tenant not found, "ControlId": <null>, "Source": <null>, "Result": 0, "ErrorCode": 4, "Description": ]

这是我用来检查成功值的代码。

 if (response.result.value as? [String: Any]) != nil {
                    // ...
                    let json=response.result.value as? [String: Any]
                    print(json!)
                    let successCode:Int=json!["Success"] as! Int
                    if(successCode==0)
                    {
                        dm.errorMessage=json!["Message"] as! String
                        callback("error")
                    }
                    else if(successCode>0)
                    {
                        dm.responseDict=json
                        callback("success")
                    }



                }

但是我收到了这个错误 enter image description here

这是什么原因?以及如何解决这个问题? 请帮我 感谢

3 个答案:

答案 0 :(得分:2)

你不能只是强行施放并强行打开一切。当您的应用程序崩溃时,由于您对游戏中的数据类型没有根据的假设,请不要感到惊讶。使用条件绑定来适当地处理错误:

guard let json = response.result.value as? [String: Any] else {
    //TODO: Handle error here safely
    fatalError("response.result.value is not of type [String: Any].")
}

print(json)

guard let successCode = json["Success"] as? Int else {
    //TODO: Handle error here safely
    fatalError("successCode doesn't exist or exists but is not valid a valid Int.")
}

switch successCode {
    case 0:
        guard let message = json["Message"] as? String else {
            //TODO: Handle error here safely
            fatalError("Messange not present, or is not a String.")
        }
        dm.errorMessage = message
        callback("error")

    case 1...Int.max:
        dm.responseDict = json
        callback("success")
}

答案 1 :(得分:0)

使用!而不是使用?强制解包。这将阻止应用程序崩溃。

答案 2 :(得分:-2)

如果代码崩溃,则密钥Success的值为BoolString

基本上你的代码非常 objectivecish ,这是一个 swiftier 版本

if let result = response.result.value as? [String: Any] {
    print(result)
    //TODO: Handle optional safely
    let success = result["Success"] as! Bool
    if success {
       dm.responseDict = result
       callback("success")
    } else {
       //TODO: Handle optional safely
       dm.errorMessage= result["Message"] as! String
       callback("error")
    }
} else {
   callback("result is not a dictionary")
}