0

我刚刚将我的项目转换为 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)

4

1 回答 1

0

这里的解析似乎有问题 - 很可能 XML 响应的结构与您想象的不完全一样。

一般来说,在 Swift 中,避免使用强制解包选项是一个好主意,!因为如果那里没有任何东西,你保证应用程序会崩溃。最好使用if lets 和guardstatements,即使它使代码更难看,只是因为它更安全。

为了调试这个,我将你的最后两行重写为一系列guards (不确定所涉及的类型是什么,所以你必须$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 负载,包括闪亮的新CodableApple 自己制定的协议)。

于 2018-01-18T14:26:41.157 回答