169

こんにちは、swift2.2 の json 解析コードが動作していますが、Swift 3.0 で使用するとエラーが発生します

ViewController.swift:132:31: メンバー 'dataTask(with:completionHandler:)' へのあいまいな参照

私のコードはこちら

   let listUrlString =  "http://bla.com?batchSize=" + String(batchSize) + "&fromIndex=" + String(fromIndex)
    let myUrl = URL(string: listUrlString);
    let request = NSMutableURLRequest(url:myUrl!);
    request.httpMethod = "GET";

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

        if error != nil {
            print(error!.localizedDescription)
            DispatchQueue.main.sync(execute: {
                AWLoader.hide()
            })

            return
        }

        do {

            let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSArray

            if let parseJSON = json {

                var items = self.categoryList

                items.append(contentsOf: parseJSON as! [String])

                if self.fromIndex < items.count {

                    self.categoryList = items
                    self.fromIndex = items.count

                    DispatchQueue.main.async(execute: {

                        self.categoriesTableView.reloadData()

                        AWLoader.hide()

                    })
                }else if( self.fromIndex == items.count){


                    DispatchQueue.main.async(execute: {

                        AWLoader.hide()

                    })

                }



            }

        } catch {
            AWLoader.hide()
            print(error)

        }
    }

    task.resume()

アイデアをありがとう。

4

14 に答える 14

315

コンパイラは、関数シグネチャによって混乱します。次のように修正できます。

let task = URLSession.shared.dataTask(with: request as URLRequest) {

ただし、以前にの代わりに宣言されていた場合URLRequest、このシグネチャのように「リクエスト」をキャストする必要はないことに注意してください。URLRequestNSMutableURLRequest

var request = URLRequest(url:myUrl!)

これは、失敗している とNSMutableURLRequestnewの間の自動キャストであり、ここでこのキャストを行うことを余儀なくされました。URLRequest

于 2016-06-14T12:46:47.957 に答える
33

myRequestとして初期化しましたNSMutableURLRequest。これが必要です:

var URLRequest

Swift は両方を捨てていNSMutable...ます。var新しいクラスに使用してください。

于 2016-09-11T21:40:58.657 に答える
15

この問題は、URLSession に 2 つの dataTask メソッドがあるために発生します

open func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask
open func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask

1 つ目はURLRequestパラメータとして、2 つ目はURLパラメータとして持つため、呼び出すタイプを指定する必要があります。たとえば、2 つ目のメソッドを呼び出したいとします。

let task = URLSession.shared.dataTask(with: url! as URL) {
    data, response, error in
    // Handler
}
于 2016-10-10T22:10:52.423 に答える
3

テスト済みの xcode 8 安定バージョン。var requestで変数を使用する必要がありますそれを使用すると、URLRequest()簡単に修正できます(バグ

var request = URLRequest(url:myUrl!)

let task = URLSession.shared().dataTask(with: request as URLRequest) { }

うまくいきました!皆さんありがとう、私は多くの人々を助けると思います。!

于 2016-10-05T20:27:12.150 に答える
2
 // prepare json data
        let mapDict = [ "1":"First", "2":"Second"]

        let json = [ "title":"ABC" , "dict": mapDict ] as [String : Any]
        let jsonData : NSData = NSKeyedArchiver.archivedData(withRootObject: json) as NSData

        // create post request
        let url = NSURL(string: "http://httpbin.org/post")!
        let request = NSMutableURLRequest(url: url as URL)
        request.httpMethod = "POST"

        // insert json data to the request
        request.httpBody = jsonData as Data


        let task = URLSession.shared.dataTask(with: request as URLRequest){ data,response,error in
            if error != nil{
                return
            }
            do {
                let result = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject]

                print("Result",result!)

            } catch {
                print("Error -> \(error)")
            }
        }

        task.resume()
于 2017-01-01T15:04:36.230 に答える
2

GET リクエストを介してデータをロードするには、何も必要ありませんURLRequest(セミコロンも必要ありません) 。

let listUrlString =  "http://bla.com?batchSize=" + String(batchSize) + "&fromIndex=" + String(fromIndex)
let myUrl = URL(string: listUrlString)!
let task = URLSession.shared.dataTask(with: myUrl) { ...
于 2017-01-01T15:49:52.960 に答える
2

Xcode 10.1 スウィフト 4

これは私のために働いた:

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

URLSessionDataTaskキーは、型宣言に追加されました。

于 2019-03-25T21:04:36.693 に答える
1

私にとっては、これを見つけて、

let url = URL(string: urlString)
URLSession.shared.dataTask(with: url!) { (data, response, error) in ...}

使えません

"let url = NSURL(string: urlString)
于 2017-01-12T00:44:15.873 に答える