我刚刚将我的项目转换为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)
答案 0 :(得分:0)
这里的解析似乎可能出现问题 - 很可能XML响应的结构并不完全符合您的想法。
一般来说,在Swift中,最好不要使用!
强制解包强制选项,因为如果没有任何东西,你可以保证应用程序崩溃。最好使用if let
和guard
语句,即使它使代码更加丑陋,只是因为它更安全。
要调试这个,我会将最后两行重写为一系列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
协议。