对成员数据任务的引用不明确 swift Xcode 8

ambiguous reference to member datatask swift Xcode 8

我刚刚更新了我的 Xcode 并且一直在尝试了解更多相关信息。这是我的 Collection View Cell 代码。我正在尝试从 URL 获取数据,但我一直对这个错误感到恼火。我在这里尝试了所有解决方案,但它们具有不同的功能结构。其他解决方案也不起作用。

import UIKit


class PersonCell: UICollectionViewCell {

@IBOutlet weak var personImage : UIImageView!



    func ConfigureCell (imgURL : String)
{

}

    func DownloadImage ( url : NSURL)
{

}

    func GetDatafromURL (URL : NSURL , completion :   @escaping ((   _ data :     NSData? , _ response : URLResponse? ,  _ error : NSError?) -> Void))
{
        URLSession.shared.dataTask(with: URL) { (data ,  response , error) in     
            completion (data , response, error)     
            }.resume()   
}
}

教程视频中的代码是这样的

    func GetDatafromURL (URL : NSURL , completion : ((  data : NSData? , response : NSURLResponse? ,  error : NSError?) -> Void))
{


    NSURLSession.sharedSession.dataTaskWithURL( URL) { (data ,  response , error) in

        completion(data : data , responce : response, error : error)


        }.resume()

您可以使用 .absoluteURL

NSURL 转换为 URL
guard let url = URL.absoluteURL else { return }

URLSession.shared.dataTask(with: url) { (data, response, error) in
    //
}.resume()

更新

您的完成块类型错误。您正在使用 NSData 而不是 DataNSError 而不是 Error。下面是它应该看起来像下面的示例。

func getData(from url: URL, completion: @escaping (_ data: Data?, _ response: URLResponse?, _ error: Error?) -> Void)
{
    URLSession.shared.dataTask(with: url) { data, response, error
        completion(data, response, error)
    }.resume()
}

请查看最新参考。

func dataTask(with: URL, completionHandler: (Data?, URLResponse?, Error?) -> Void)

Declaration

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

在Swift 3中,dataTask(with:completionHandler:)的completionHandler接受3个类型为Data?URLResponse?Error?的参数。因此,无法应用类型为 (NSData?,URLResponse?,NSError?) -> Void 的方法 completion

第一个参数是URL

(感谢 vadian,他在这里提出了所有需要的东西。)

所以,您的 GetDatafromURL 需要是这样的:

func GetDatafromURL(url: URL, completion: @escaping ((_ data: Data?, _ response: URLResponse?,  _ error: Error?) -> Void))
{
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        completion (data , response, error)
    }.resume()
}