Mister Davenport Mister Davenport - 3 months ago 144
iOS Question

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

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

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.