我有一个检索远程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()
,那么一切都很好! - 最后,如果我将原始行更改为以下行,它也可以工作
NSLog(“HTTP请求错误=(错误!.代码),描述= %@",错误描述)
是否因为NSlog无法正确处理字符串插值?
如果是这样的话,那么为什么在某些情况下如"HTTP request error = \(error!.code)
,它能起作用呢?
**我的开发环境:**Xcode:OS X操作系统7.0.1版(7A 1001):约塞米蒂10.10.5(14 F27
感谢您抽出宝贵时间!!:)
1条答案
按热度按时间velaa5lx1#
NSLog()
的第一个参数是一个 * 格式字符串 *,类似于C库中的printf()
函数。此格式字符串用作模板,并包含 * 格式说明符 *,如%d
、%s
、%@
......该格式指定如何解释其余参数。现在在你的情况下
错误代码和描述被插入到格式字符串中。如果错误描述恰好包含格式说明符(例如
%s
),则NSLog()
需要另一个参数(例如string)。如果没有参数或参数类型错误,则行为未定义,代码可能会崩溃。因此,格式字符串应始终为常量字符串文字:
如果你想利用Swift字符串插值,那么只使用
%@
作为格式,并将插值后的String
作为附加参数传递: