2016-11-06 3 views
0

Я пытаюсь преобразовать один из моих проектов из Swift 2.3 в Swift 3.0, но по какой-то причине я получаю следующую ошибку. .Преобразование Swift 2.3 в Swift 3.0 - Ошибка, не может вызвать «dataTask» с списком аргументов типа «

не может ссылаться на 'dataTask' со списком аргументов типа '(с: NSMutableURLRequest, completionHandler: (Data ?, UIRLResponse ?, NSError) -> Пустота)'

перегрузками для «dataTask существуют с этими частично совпадающими списками параметров: (с помощью: URLRequest, completeHandler: @escaping (Data ?, URLResponse ?, Error?) -> Void), (с помощью: URL, completeHandler (? Data ?, URLResponse ?, ошибка) @escaping -> Пустота)

Ошибка показывает в этой строке, используя код ...

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") 
     } 
    } 
+1

типа он использует 'URLRequest', а не' 'NSMutableURLRequest'/NSURLRequest'. – Rob

+0

Вы правы, это была главная проблема. Спасибо –

ответ

7

Компилятор хочет URLRequest и Error

... 
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 
+0

'URLRequest' решил главную ошибку, но после изменения XCode предложил добавить ** как! (Data ?, URLResponse ?, Ошибка? ** на главную панель, и теперь она работает. Спасибо 'let task = session.dataTask (с: request, completionHandler: {(// code} as! (Data ?, URLResponse? , Error?) -> Void) ' –

+1

Не бросать' (// code} as! (Data ?, URLResponse ?, Error?) -> Void) ', пожалуйста, внимательно прочитайте мой ответ. – vadian

+0

@ vadian - Хмм, я по какой-то причине у меня возникла ошибка, когда я попробовал ваше предложение, но теперь я попробовал еще раз, и он работал 'let task = session.dataTask (с: request, completeHandler: {(responseData, response, error) -> Void in' Большое спасибо. Вопрос: что будет с проблемой, предложенной XCode (кастинг)? –

Смежные вопросы