完成处理程序给出:在更新为 swift 2 后,表达式类型在没有更多上下文的情况下不明确
Completion handler giving: Type of expression is ambiguous without more context, after updating to swift 2
我正在使用 swift 的 SODA 客户端(由 Socrata 创建),我刚刚更新到 XCode 7 和 swift 2 并发现了一些问题。我无法解决的一个是完成处理程序的情况,当它发现错误时,它不接受应该得到错误的行 "syncCompletion(.Error (reqError))" 和 return 到主线程。
我在这里 "Type of expression is ambiguous without more context" 看到许多描述相同的错误,但在完成处理程序中没有,我看到一个使用 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)))
}
})
已解决,我替换为:
if reqError != nil
与
if let error = reqError
和:
syncCompletion(.Error (reqError))
和
syncCompletion(.Error (error))
我正在使用 swift 的 SODA 客户端(由 Socrata 创建),我刚刚更新到 XCode 7 和 swift 2 并发现了一些问题。我无法解决的一个是完成处理程序的情况,当它发现错误时,它不接受应该得到错误的行 "syncCompletion(.Error (reqError))" 和 return 到主线程。
我在这里 "Type of expression is ambiguous without more context" 看到许多描述相同的错误,但在完成处理程序中没有,我看到一个使用 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)))
}
})
已解决,我替换为:
if reqError != nil
与
if let error = reqError
和:
syncCompletion(.Error (reqError))
和
syncCompletion(.Error (error))