Expected Type Before / After —>, Expected Declaration in Swift 3

user6684504 picture user6684504 · Aug 21, 2016 · Viewed 7.4k times · Source

So, I created a typealias to store a completion handler, to later pass into a function called submitTokenToBackend using Stripe's iOS library. Here is my code:

// 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")
            }
        }
    }
}
}

I am getting these weird errors, now, in Swift 3 concerning my completion handler not having expected types. Not an isolated incident, either. Any thoughts?

Answer

OOPer picture OOPer · Aug 22, 2016

Almost all thing you need is described in Rob Napier's answer.

I'll try to show you a little more concrete code...

You can define the completion handler and pass it to submitTokenToBackend(completionHandler:) like this:

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

With removing intermediate let-constant, you can write it in this way:

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

Using the trailing closure feature of Swift, the above code can be shortened to:

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

Your code is far from any of above three.