无法使用类型的参数列表调用“dataTask”(使用:NSMutableRequest,...)

Posted

技术标签:

【中文标题】无法使用类型的参数列表调用“dataTask”(使用:NSMutableRequest,...)【英文标题】:Cannot invoke 'dataTask' with an argument list of type (with: NSMutableRequest, ...) 【发布时间】:2017-08-28 06:55:50 【问题描述】:

func performGetRequest(_ targetURL: URL!, completion: @escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void) 
    let request = NSMutableURLRequest(url: targetURL)
    request.httpMethod = "GET"

    let sessionConfiguration = URLSessionConfiguration.default

    let session = URLSession(configuration: sessionConfiguration)

    let task = session.dataTask(with: request, completionHandler:  (data: Data?, response: URLResponse?, error: NSError?) -> Void in
        DispatchQueue.main.async(execute:  () -> Void in
            completion(data, (response as! HTTPURLResponse).statusCode, error)
        )
    )

    task.resume()

在这里,我正在尝试 appCoda 的演示以集成 YouTube API。但由于此方法错误无法进一步移动:

无法使用类型为“(使用:NSMutableURLRequest,completionHandler:(Data?, URLResponse..)”的参数列表调用“dataTask”

【问题讨论】:

是的,我已经编辑了我的问题。谢谢。 你的问题不清楚,你想完成什么,遇到了什么错误?请参阅How to ask a good question 部分。 let request = NSMutableURLRequest(url: targetURL) 使用URLRequest 而不是NSMutableURLRequest 对不起,我是 swift 新手。不知道要问什么。如果你能帮忙,请。 NSStuff:旧的 Objective-C 之一。首选 Swift 类型(只要有一个以 NS 为前缀的类,请检查是否没有 Swift 等效项,也没有“Mutable”)。 dataTask 不知道 (with: 的第一个参数属于 NSMutableURLRequest 类的方法,这就是编译器对你大喊大叫的原因。 【参考方案1】:

你可以使用 URLRequest 代替 NSMutableURLRequest:

public func getData(withApiEndpoint apiURL: String, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) 
        var request = URLRequest(url: URL(string: apiURL)!)
        for (key, value) in self.getDefaultHeaders() 
            request.setValue(value, forHTTPHeaderField: key)
        

        request.httpMethod = String.kGet

        if self.networkSession == nil 
            self.networkSession = URLSession(configuration: getSharedConfiguration(self.isIncognito))
        
        self.networkDataTask = self.networkSession?.dataTask(with: request as URLRequest)  (data, response, error) in
            if error != nil 
                debugPrint(error!.localizedDescription)
            
            completionHandler(data, response, error)
        
        self.networkDataTask?.resume()
    

【讨论】:

【参考方案2】:

试试这个 -

func performGetRequest(_ targetURL: URL!, completion: @escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void) 
    var request = URLRequest(url: targetURL)
    request.httpMethod = "GET"

    let sessionConfiguration = URLSessionConfiguration.default

    let session = URLSession(configuration: sessionConfiguration)

    let task = session.dataTask(with: request)  (data, response, error) in
        DispatchQueue.main.async(execute:  () -> Void in
            completion(data, (response as! HTTPURLResponse).statusCode, error)
        )
    

    task.resume()

【讨论】:

【参考方案3】:

使用 URLRequest 代替 NSMutableURLRequest

func performGetRequest(_ targetURL: URL!, completion: @escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void) 
        var request = URLRequest(url: targetURL)
        request.httpMethod = "GET"

        let sessionConfiguration = URLSessionConfiguration.default

        let session = URLSession(configuration: sessionConfiguration)


        let task = session.dataTask(with: request, completionHandler:  (data: Data?, response: URLResponse?, error: NSError?) -> Void in
            DispatchQueue.main.async(execute:  () -> Void in
                completion(data, (response as! HTTPURLResponse).statusCode, error)
            )
         as! (Data?, URLResponse?, Error?) -> Void)

        task.resume()
    

【讨论】:

您好,上面的 cmets 中已经定义了。谢谢你的回答。 这导致最后一行的 EXC_BAD_INSTRUCTION (code=EXC_i386_INVOP,subcode=0x0) 为! (Data?, URLResponse?, Error?) -> Void) 一分钟我会帮你检查

以上是关于无法使用类型的参数列表调用“dataTask”(使用:NSMutableRequest,...)的主要内容,如果未能解决你的问题,请参考以下文章

无法使用参数列表调用类型“附加”

无法使用“(nil)”类型的参数列表调用“保存”

无法使用类型为“”的参数列表调用类型“”的初始化程序

无法使用类型为“()”的参数列表为类型“Int”调用初始化程序

无法使用类型参数列表调用“requestAuthorizationToShareTypes”

无法使用类型参数列表调用“requestAuthorizationToShareTypes”