2016-08-21 4 views
2

Also habe ich einen Typalias erstellt, um einen Completion-Handler zu speichern, um später mit der iOS-Bibliothek von Stripe in eine Funktion namens submitTokenToBackend zu gelangen. Hier ist mein Code:Erwarteter Typ Vorher/Nachher ->, Erwartete Deklaration in Swift 3

// MARK: - Create Completion Handlers 

typealias CompletionHandler = (_ token: AnyObject?, _ error: NSError?) -> Void 

// MARK: - Submit Token To Backend 

func submitTokenToBackend(completionHandler: CompletionHandler) { 

} 

// MARK: - STPPaymentCardTextFieldDelegate 


func paymentCardTextFieldDidChange(_ textField: STPPaymentCardTextField) { 
    print("Card number: \(textField.cardParams.number) Exp Month: \(textField.cardParams.expMonth) Exp Year: \(textField.cardParams.expYear) CVC: \(textField.cardParams.cvc)") 
    self.buyButton.isEnabled = textField.isValid 
} 

// MARK: Initialize Card Params 

let cardParams = STPCardParams() 

func cardParamsFunc() { 
    cardParams.number = "4242424242424242" 
    cardParams.expMonth = 10 
    cardParams.expYear = 2018 
    cardParams.cvc = "123" 
    STPAPIClient.shared().createToken(withCard: cardParams){ (token, error) in 

     if let error = error { 
      print(error.localizedDescription) 

     } else if let token = token { 

// HERE'S WHERE I'M GETTING ERRORS 

      self.submitTokenToBackend(completionHandler: CompletionHandler) -> Void { 
       if let error = error { 
      print(error.localizedDescription) 
       } else { 
        print("Show receipt page") 
      } 
     } 
    } 
} 
} 

ich diese seltsamen Fehler bekommen, jetzt, in Swift 3 über meinen Abschluss-Handler nicht zu erwarten Typen haben. Auch kein Einzelfall. Irgendwelche Gedanken?

Antwort

0
self.submitTokenToBackend(completionHandler: CompletionHandler) -> Void { 

Dies ist eine Deklaration, kein Methodenaufruf. Sie können keine Typalias als Parameter übergeben. Und -> Void macht hier überhaupt keinen Sinn. Sie fast sicher

gemeint
self.submitTokenToBackend { 

Wenn Sie auf diese weitere Fragen haben, jedoch müssen Sie den Code liefern wir (siehe mcve) und die Liste der genauen Fehler zusammenstellen können. "Weird errors" ist nicht besonders hilfreich beim Debuggen.

+0

Hallo Rob. Die Funktion submitTokenToBackend mit Completion-Handler verwendet ein Argument des Completion-Handlers, die zuvor deklarierten Typaliäten ** typalias CompletionHandler = (_ token: AnyObject ?, _ error: NSError?) -> Void ** Was soll ich weitergeben, wenn nicht? Abschluss Handler? Die Argumente der Typalien? Würde das nicht den Punkt besiegen? –

+0

Just doing ** self.submitTokenToBackend {** löst die Ausnahme aus ** Kontexttyp für die Closure-Argumentliste erwartet 2 Argumente, die nicht implizit ignoriert werden können ** mit einem Fix von ** _, _ in **, was die Fehler verursacht * * Aufeinander folgende Anweisungen in einer Zeile müssen durch ";" ** und ** Erwarteter Ausdruck getrennt werden ** –

0

Ich bin nicht sicher, aber ... Wo ist 'CompletionHandler' Implementierung? Wie ich verstehe, deklarieren Sie einfach einen ähnlichen Block in Objective - C ('typedef void (^ completionHandler) (ID-Token);'), aber verwenden Sie ihn nicht.

+0

@OOper Ja. Ich wollte gerade Rob Napiers Antwort akzeptieren. Ich habe nichts mit dem Hundeführer gemacht und habe es "alleine" herausgefunden, nachdem ich verstanden habe, dass ich den Hundeführer erklärt habe, ohne irgendetwas zu übergeben. Ich bin mir nicht sicher, ob ich das richtig gesagt habe. Danke, alle! –

1

Fast alles, was Sie brauchen, ist in Rob Napiers Antwort beschrieben.

Ich werde versuchen, Ihnen zu zeigen, ein wenig konkreten Code ...

Sie können die Abschluss-Handler definieren und zu submitTokenToBackend(completionHandler:) wie dies passieren:

  let theCompletionHandler: CompletionHandler = {token, error in 
       if let error = error { 
        print(error.localizedDescription) 
       } else { 
        print("Show receipt page") 
       } 
      } 
      self.submitTokenToBackend(completionHandler: theCompletionHandler) 

mit dem Entfernen von Zwischen let-Konstante , können Sie es auf diese Weise schreiben:

  self.submitTokenToBackend(completionHandler: {token, error in 
       if let error = error { 
        print(error.localizedDescription) 
       } else { 
        print("Show receipt page") 
       } 
      }) 

den hinteren Verschlussmerkmal Swift verwenden, können Sie den obigen Code zu verkürzen:

  self.submitTokenToBackend {token, error in 
       if let error = error { 
        print(error.localizedDescription) 
       } else { 
        print("Show receipt page") 
       } 
      } 

Ihr Code ist weit entfernt von einem der obigen drei.

Verwandte Themen