我正在使用 SODA Client for swift(由 Socrata 创建),我刚刚更新到 XCode 7 和 swift 2 并发现了一些麻烦。我无法解决的一个是完成处理程序发现错误时的情况,它不接受应该得到错误并返回主线程的“syncCompletion(.Error(reqError))”行。
我在这里看到了许多具有相同描述的错误“表达式的类型在没有更多上下文的情况下不明确”,但在完成处理程序中没有,我看到一个使用 do - catch 的错误是不同的。我对 swift 的了解还不够,无法找到改变这种情况的方法。
一些答案假设您应该重写代码,因为某些类型在 swift 2 中可能会发生变化,但我不知道从哪里开始重写。
在此先感谢您的帮助。
var task = session.dataTaskWithRequest(request, completionHandler: { data, response, reqError in
// We sync the callback with the main thread to make UI programming easier
let syncCompletion = { res in NSOperationQueue.mainQueue().addOperationWithBlock { completionHandler (res) } }
// Give up if there was a net error
if reqError != nil {
syncCompletion(.Error (reqError))
return
}
// Try to parse the JSON
// println(NSString (data: data, encoding: NSUTF8StringEncoding))
var jsonError: NSError?
var jsonResult: AnyObject!
do {
jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
} catch var error as NSError {
jsonError = error
jsonResult = nil
} catch {
fatalError()
}
if let error = jsonError {
syncCompletion(.Error (error))
return
}
// Interpret the JSON
if let a = jsonResult as? [[String: AnyObject]] {
syncCompletion(.Dataset (a))
}
else if let d = jsonResult as? [String: AnyObject] {
if let e : AnyObject = d["error"] {
if let m : AnyObject = d["message"] {
syncCompletion(.Error (NSError(domain: "SODA", code: 0, userInfo: ["Error": m])))
return
}
}
syncCompletion(.Dataset ([d]))
}
else {
syncCompletion(.Error (NSError(domain: "SODA", code: 0, userInfo: nil)))
}
})