2016-11-06 7 views
0

aufrufen Ich versuche, eines meiner Projekte von Swift 2.3 zu Swift 3.0 zu konvertieren, aber aus irgendeinem Grund bekomme ich den folgenden Fehler ..Konvertieren von Swift 2.3 in Swift 3.0 - Fehler, kann 'DataTask' nicht mit einer Argumentliste vom Typ '

Kann 'dataTask' mit einer Argumentliste vom Typ aufrufen '(mit: NSMutableURLRequest, completionHandler: (Data ?, UIRLResponse ?, NSError) -> Void)'

Überlastungen für ‚dataTask. 'existieren mit diesen teilweise übereinstimmenden Parameterlisten: (mit: URLRequest, completionHandler: @escaping (Daten ?, URLResponse ?, Fehler?) -> Void), (mit: URL, completionHandler : (Daten ?, URLResponse ?, Error) @escaping - unten vom code> Void)

Der Fehler in dieser Zeile zeigt ...

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

Jeder Vorschlag?

Hier ist der gesamte Code für die Funktion, in der der Fehler auftritt.

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

Es verwendet eine 'URLRequest' wegzulassen, kein' NSMutableURLRequest'/'NSURLRequest'. – Rob

+0

Sie haben Recht, das war das Hauptproblem. Danke –

Antwort

7

Der Compiler will URLRequest und Error

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

Ich empfehle alle Anmerkungen Typ

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

'URLRequest' löste den Hauptfehler, aber nachdem ich das geändert hatte, schlug XCode vor, ** as hinzuzufügen! (Daten ?, URLResponse ?, Fehler? ** zum Hauptfenster, und es funktioniert jetzt. Danke 'lass task = session.dataTask (mit: request, completionHandler: {(// code} als! (Daten ?, URLResponse? , Fehler?) -> Void) ' –

+1

Nicht '(// code} als! (Daten ?, URLResponse ?, Fehler?) -> Void)' ', bitte lesen Sie meine Antwort sorgfältig. – vadian

+0

@ vadian - Hmm, ich Aus irgendeinem Grund habe ich einen Fehler bekommen, als ich Ihren Vorschlag ausprobiert habe, aber jetzt habe ich es erneut versucht und es hat 'task = session.dataTask (mit: request, completionHandler: {(responseData, response, error) -> Void in') funktioniert Vielen Dank, schnelle Frage, was wäre das Problem mit dem Ansatz von XCode (Casting) vorgeschlagen? –

Verwandte Themen