1

これを読む前に、私は Swift の初心者であり、学習しようとしていることを理解してください。答えを得ることを期待していくつかのサイトを閲覧しましたが、見つからないか、間違って実行しました.. このチュートリアルに従ってきましたが、これは古くて更新されていません >>従ったチュートリアル<<

また、いくつかをswift 3に変更しようとしましたが、おそらく正しく実行できませんでした。

URLSession を正しく行うにはどうすればよいですか? 次のエラーが表示されます。

タイプ '(_, _, _) のスロー関数から無効な変換がスローされます -> Void' から非スロー関数タイプへ

以下のこの行について:

let task : URLSessionDataTask = session.dataTask(with: request, completionHandler: {data, response, error -> Void in

変数「jsonDict」について-私が持っているエラーが発生します

呼び出しに余分な引数「エラー」があります。

前もって感謝します

var urlString:String = ("http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol IN "+stringQuotes+"&format=json&env=http://datatables.org/alltables.env").addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!

    var url : URL = URL(string: urlString)!
    var request: URLRequest = URLRequest(url:url)
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)

    let task : URLSessionDataTask = session.dataTask(with: request, completionHandler: {data, response, error -> Void in

        if((error) != nil) {
            println(error.localizedDescription)
        }
        else {
            var err: NSError?

            var jsonDict = try JSONSerialization.JSONObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers, error: &err) as NSDictionary
            if(err != nil) {
                println("JSON Error \(err!.localizedDescription)")
            }
            else {
                var quotes:NSArray = ((jsonDict.objectForKey("query") as NSDictionary).objectForKey("results") as NSDictionary).objectForKey("quote") as NSArray
                DispatchQueue.main.async(execute: {
                    .default.post(name: Notification.Name(rawValue: kNotificationStocksUpdated), object: nil, userInfo: [kNotificationStocksUpdated:quotes])
                })
            }
        }
    })
    task.resume()
}
4

2 に答える 2

1

Swift 3.0 の更新されたコードを見つけてください

var urlString:String = ("http://query.yahooapis.com/v1/public/yql?q=select * from yahoo.finance.quotes where symbol IN "+stringQuotes+"&format=json&env=http://datatables.org/alltables.env").addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed)!

        let url : URL = URL(string: urlString)!
        let request: URLRequest = URLRequest(url:url)
        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)

        let task = session.dataTask(with: request) { (data, response, error) in

            if(error != nil){
                print(error?.localizedDescription ?? "")
            }
            else{
                do{
                    let jsonDict:NSDictionary = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary
                    let quotes:NSArray = ((jsonDict.object(forKey: "query") as! NSDictionary).object(forKey: "results") as! NSDictionary).object(forKey: "quote") as! NSArray
                    print(quotes)

                }
                catch{
                    print(error.localizedDescription)
                }
            }
        };
        task.resume()

注:コードはテストしていません。URLの引数を指定していないため

于 2016-11-22T02:34:43.690 に答える
0

あなたの問題は ではなく にありURLSessionDataTaskますcompletionHandler。より具体的にはvar jsonDict = try JSONSerialization...ビットで。tryコードは例外をスローできるが、それを処理しないことを示します ( catch)。(_, _, _) throws -> Voidそのため、コンパイラは完了ハンドラがwhile dataTaskmethod expected型であると判断します(_, _, _) -> Void

ここでは、 の使用方法に関する情報を見つけることができますtry/catch

于 2016-11-22T02:16:03.433 に答える