SODA Client for swift (作成者 Socrata) を使用しています。XCode 7 と Swift 2 に更新したところ、いくつかの問題が見つかりました。私が解決できなかったのは、エラーが見つかったときの完了ハンドラーのケースです。エラーを取得してメインスレッドに戻るはずの行「syncCompletion(.Error (reqError))」を受け入れていません。
ここで同じ説明の「式のタイプがあいまいであり、コンテキストがありません」というエラーが多数見られましたが、完了ハンドラーではなく、do - catch を使用しているものを見ましたが、これは異なります。これを変更する方法を見つけるのに十分な速さを知りません。
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)))
}
})