我有一个用于检索远程json文件的代码。我试图在网络不可用时打印错误(故意在飞机模式上进行测量以产生错误)。
但每次都在日志记录行上引发了一个EXE_BAD_ACCESS
我的代码是这样的:
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){
(response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
if(error != nil){
let errorDesc = error!.description ?? ""
NSLog("HTTP request error = \(error!.code), desc = \(errorDesc)")
handler(houseList, error)
return
}
...Omitted for Brevity...
}
NSLog("HTTP request error = \(error!.code), desc = \(errorDesc)")
是引发错误的行
我的观察结果:
首先,在我的调试窗口中error.description
看起来
非常好。我可以毫无问题地看到数据。
其次,如果我将NSLog更改为print()
,那么一切正常
细<!/ p>
最后,如果我将原始行更改为以下内容,它也会起作用
NSLog(&#34; HTTP请求错误=(错误!.code),desc =%@&#34;,errorDesc)
是因为NSlog无法正确处理 String Interpolation 吗?
如果是这种情况,那么为什么在某些情况下,例如"HTTP request error = \(error!.code)
,它可以起作用?
我的开发环境 Xcode:版本7.0.1(7A1001) OS X:Yosemite 10.10.5(14F27
感谢您的时间! :)
答案 0 :(得分:4)
NSLog()
的第一个参数是格式字符串,类似于
C库中的printf()
函数。此格式字符串用于
作为模板并包含format specifiers
例如%d
,%s
,%@
,...格式指定如何
剩下的参数被解释。
现在在你的情况下,在
NSLog("HTTP request error = \(error!.code), desc = \(errorDesc)")
将错误代码和描述内插到格式字符串中。
如果错误描述恰好包含格式说明符(例如%s
),则NSLog()
需要另一个参数(例如字符串)。
如果没有参数或者类型错误,则行为是
未定义且代码可能崩溃。
因此,格式字符串应始终为常量字符串文字:
NSLog("HTTP request error = %ld, desc = %@", error!.code, errorDesc)
如果你想利用Swift字符串插值
然后只使用%@
作为格式并传递插值String
作为附加论点:
NSLog("%@", "HTTP request error = \(error!.code), desc = \(errorDesc)")