SWXMLHash EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

时间:2018-01-18 13:50:13

标签: swift swxmlhash

我刚刚将我的项目转换为swift 4,但是当我使用SWXMLHash模拟我的应用时出错:

    var code: Int! = nil
    var message: String! = nil
    var paramsContent: String! = nil
    let xmlStrData = SWXMLHash.lazy(strData)

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"


    let appDel: AppDelegate = UIApplication.shared.delegate as! AppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext

    let simulationParamsDescription = NSEntityDescription.entity(forEntityName: "SimulationParams", in: context)
    let simulationParams = NSManagedObject(entity: simulationParamsDescription!, insertInto: context)


    code = Int((xmlStrData["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:GetSimulationParamsResponse"]["GetSimulationParamsReturn"]["code"].element?.text)!)!
    message = xmlStrData["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:GetSimulationParamsResponse"]["GetSimulationParamsReturn"]["message"].element?.text

当我试图获取代码节点值时,我收到此错误:

EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

1 个答案:

答案 0 :(得分:0)

这里的解析似乎可能出现问题 - 很可能XML响应的结构并不完全符合您的想法。

一般来说,在Swift中,最好不要使用!强制解包强制选项,因为如果没有任何东西,你可以保证应用程序崩溃。最好使用if letguard语句,即使它使代码更加丑陋,只是因为它更安全。

要调试这个,我会将最后两行重写为一系列guard(不确定所涉及的类型是什么,所以你必须适当地填写$DICT_TYPE_HERE) 。您可能不需要为每个级别执行此操作,但我肯定会避免在一行上访问4-5级别 - 它只是在寻找麻烦。

guard let envelope = xmlStrData["SOAP-ENV:Envelope"] else as? $DICT_TYPE_HERE {
 //handle failure
 return 
}
guard let body = envelope["SOAP-ENV:Body"] else as? $DICT_TYPE_HERE {
 //handle failure 
 return 
}
.
.
until you find the problem

理想情况下,您应该使用XML对象映射器,它允许您声明可以来回转换为XML的Swift对象,但遗憾的是我找不到一个明显的Swift对象(有JSON的加载,包括Apple自己制定的闪亮的Codable协议。