将 Swift 2.3 转换为 Swift 3.0 - 错误,无法使用类型参数列表调用“dataTask" [英] Converting Swift 2.3 to Swift 3.0 - Error, Cannot invoke 'dataTask' with an argument list of type'
问题描述
我正在尝试将我的一个项目从 Swift 2.3 转换为 Swift 3.0 但由于某种原因我收到以下错误...
<块引用><块引用>无法使用类型为'(with: NSMutableURLRequest, completionHandler:(Data?, UIRLResponse?, NSError) -> Void)'的参数列表调用'dataTask'
'dataTask' 的重载存在于这些部分匹配的参数列表中:(with: URLRequest, completionHandler:@escaping(Data?, URLResponse?, Error?) -> Void), (with: 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?){让receiptURL = Bundle.main.appStoreReceiptURL!如果让收据=尝试?数据(内容:receiptURL){//收据存在让 requestContents = ["receipt-data":receipt.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))]//执行请求做 {让 requestData = 尝试 JSONSerialization.data(withJSONObject: requestContents, options: JSONSerialization.WritingOptions(rawValue: 0))//构建URL请求let storeURL = URL(string: "https://buy.itunes.apple.com/verifyReceipt")//生产地址//let storeURL = NSURL(string: "https://sandbox.itunes.apple.com/verifyReceipt")//测试 URL让请求 = NSMutableURLRequest(url: storeURL!)request.httpMethod = "发布"request.httpBody = requestData让会话 = URLSession.sharedlet task = session.dataTask(with: request, completionHandler: { (responseData:Data?, response:URLResponse?, error:NSError?) -> Void in//做 {让 json = 尝试 JSONSerialization.jsonObject(with: responseData!, options: .mutableLeaves) as!NSD字典打印(json)if (json.object(forKey: "status") as! NSNumber) == 0 {//如果让 latest_receipt = json["latest_receipt_info"]{self.validatePurchaseArray(latest_receipt as! NSArray)} 别的 {让receipt_dict = json["receipt"] as!NSD字典如果让购买 =receipt_dict["in_app"] 作为?NSArray{self.validatePurchaseArray(purchases)}}如果交易 != nil {SKPaymentQueue.default().finishTransaction(交易!)}DispatchQueue.main.sync(execute: { () -> Void inself.delegate?.managerDidRestorePurchases()})} 别的 {//调试收据打印(json.object(forKey:状态")作为!NSNumber)}} 抓住 {打印(错误)}})任务.resume()} 抓住 {打印(错误)}} 别的 {//收据不存在打印(没有收据")}}
编译器想要 URLRequest
和 Error
<代码> ...var request = URLRequest(url: storeURL!)request.httpMethod = "发布"...让任务 = session.dataTask(with: request,完成处理程序:{(响应数据:数据?,响应:URL响应?,错误:错误?)->作废
我建议省略所有类型注释
let task = session.dataTask(with: request,完成处理程序:{(响应数据,响应,错误)->作废
I'm trying to convert one of my projects from Swift 2.3 to Swift 3.0 but some reason I get the following error...
Cannot invoke 'dataTask' with an argument list of type'(with: NSMutableURLRequest, completionHandler:(Data?, UIRLResponse?, NSError) -> Void)'
Overloads for ‘dataTask’ exist with these partially matching parameter lists: (with: URLRequest, completionHandler:@escaping(Data?, URLResponse?, Error?) -> Void), (with: URL, completionHandler: @escaping(Data?, URLResponse?, Error?) -> Void)
The error shows in this line from the code below...
let task = session.dataTask(with: request, completionHandler: { (responseData:Data?, response:URLResponse?, error:NSError?) -> Void in
Any suggestion?
Here is the whole code for function where the error occurs.
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")
}
}
The compiler wants URLRequest
and Error
...
var request = URLRequest(url: storeURL!)
request.httpMethod = "Post"
...
let task = session.dataTask(with: request,
completionHandler: { (responseData:Data?,
response:URLResponse?,
error:Error?) -> Void in
I recommend to omit all type annotations
let task = session.dataTask(with: request,
completionHandler: { (responseData, response, error) -> Void in
这篇关于将 Swift 2.3 转换为 Swift 3.0 - 错误,无法使用类型参数列表调用“dataTask"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!