【问题标题】:Converting Swift 2.3 to Swift 3.0 - Error, Cannot invoke 'dataTask' with an argument list of type'将 Swift 2.3 转换为 Swift 3.0 - 错误,无法使用类型参数列表调用“dataTask”
【发布时间】:2017-03-20 00:01:13
【问题描述】:

我正在尝试将我的一个项目从 Swift 2.3 转换为 Swift 3.0,但由于某种原因我收到以下错误...

不能使用类型参数列表调用“dataTask”(带有:NSMutableURLRequest,completionHandler:(Data?, UIRLResponse?, NSError) -> Void)'

“dataTask”的重载存在这些部分匹配的参数列表:(带有:URLRequest,completionHandler:@escaping(Data?,URLResponse?,Error?)-> Void),(带有:URL,completionHandler:@escaping( Data?, URLResponse?, Error?) -> Void)

错误显示在下面代码的这一行中...

let task = session.dataTask(with: request, completionHandler: { (responseData:Data?, response:URLResponse?, error:NSError?) -> Void in

有什么建议吗?

这是发生错误的函数的完整代码。

func verifyReceipt(_ transaction:SKPaymentTransaction?){
        let receiptURL = Bundle.main.appStoreReceiptURL!
        if let receipt = try? Data(contentsOf: receiptURL){
            //Receipt exists
            let requestContents = ["receipt-data" : receipt.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))]

            //Perform request
            do {
                let requestData = try JSONSerialization.data(withJSONObject: requestContents, options: JSONSerialization.WritingOptions(rawValue: 0))

                //Build URL Request
                let storeURL = URL(string: "https://buy.itunes.apple.com/verifyReceipt")// production URL
                //let storeURL = NSURL(string: "https:/sandbox.itunes.apple.com/verifyReceipt") // Testing URL
                let request = NSMutableURLRequest(url: storeURL!)
                request.httpMethod = "Post"
                request.httpBody = requestData

                let session = URLSession.shared
                let task = session.dataTask(with: request, completionHandler: { (responseData:Data?, response:URLResponse?, error:NSError?) -> Void in
                    //

                    do {
                        let json = try JSONSerialization.jsonObject(with: responseData!, options: .mutableLeaves) as! NSDictionary

                        print(json)

                        if (json.object(forKey: "status") as! NSNumber) == 0 {
                            //

                            if let latest_receipt = json["latest_receipt_info"]{
                                self.validatePurchaseArray(latest_receipt as! NSArray)
                            } else {
                                let receipt_dict = json["receipt"] as! NSDictionary
                                if let purchases = receipt_dict["in_app"] as? NSArray{
                                    self.validatePurchaseArray(purchases)
                                }
                            }

                            if transaction != nil {
                                SKPaymentQueue.default().finishTransaction(transaction!)
                            }

                            DispatchQueue.main.sync(execute: { () -> Void in
                                self.delegate?.managerDidRestorePurchases()
                            })


                        } else {
                            //Debug the receipt
                            print(json.object(forKey: "status") as! NSNumber)
                        }

                    } catch {
                        print(error)
                    }
                })

                task.resume()

            } catch {
                print(error)
            }

        } else {
            //Receipt does not exist
            print("No Receipt")
        }
    }

【问题讨论】:

  • 它使用URLRequest,而不是NSMutableURLRequest/NSURLRequest
  • 没错,这是主要问题。谢谢

标签: swift swift3


【解决方案1】:
var request = URLRequest(url: storeURL!)
 request.httpMethod = "Post"

 let task = session.dataTask(with: request, 
                completionHandler: { (responseData:Data?, 
                                          response:URLResponse?, 
                                             error:Error?) -> Void in

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

https://swift.org/migration-guide-swift3/

【讨论】:

    【解决方案2】:

    编译器需要URLRequestError

     ...
     var request = URLRequest(url: storeURL!)
     request.httpMethod = "Post"
     ...
     let task = session.dataTask(with: request, 
                    completionHandler: { (responseData:Data?, 
                                              response:URLResponse?, 
                                                 error:Error?) -> Void in
    

    我建议省略所有类型注释

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

    【讨论】:

    • URLRequest 解决了主要错误,但更改后,XCode 建议添加 as! (Data?, URLResponse?, Error? 到主要的clousure,它现在正在工作。谢谢let task = session.dataTask(with: request, completionHandler:{( // code } as! (Data?, URLResponse?, Error?) -> Void)
    • 请勿投( // code } as! (Data?, URLResponse?, Error?) -> Void),请仔细阅读我的回答。
    • @vadian - 嗯,由于某种原因,我在尝试您的建议时遇到了错误,但现在我再次尝试并成功了let task = session.dataTask(with: request, completionHandler: { (responseData, response, error) -> Void in 非常感谢。快速提问,采用 XCode 建议的方法(强制转换)会有什么问题?
    • 从 Swift 2 到 Swift 3 的迁移器做得非常好,但并不完美。信任好,控制好,在文档中查找相应方法的签名。
    • 对成员 'data Task(with:completionHandler:)' 的模糊引用我在执行相同操作后遇到了这个问题 let task = session.dataTask(with: request, completionHandler: { (responseData, response, error ) -> 无效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多