预期类型之前/之后 - >,Swift 3中的预期声明

时间:2016-08-21 20:34:55

标签: ios token stripe-payments swift3 completionhandler

因此,我创建了一个类型来存储一个完成处理程序,以便稍后使用Stripe的iOS库传递给一个名为submitTokenToBackend的函数。这是我的代码:

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

我现在在Swift 3中遇到这些奇怪的错误,关于我的完成处理程序没有预期的类型。也不是孤立的事件。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

Rob Napier的回答几乎描述了你所需要的一切。

我会试着向你展示更具体的代码......

您可以定义完成处理程序并将其传递给submitTokenToBackend(completionHandler:),如下所示:

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

删除中间let-constant,你可以这样写:

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

使用Swift的尾随闭包功能,上面的代码可以缩短为:

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

您的代码远非上述任何一种。

答案 1 :(得分:0)

我不确定,但......在哪里' CompletionHandler'实施?据我所知,你只是在Objective-C中声明了一些像block(' typedef void(^ completionHandler)(id token);'),但是不要使用它。

答案 2 :(得分:0)

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

这是一个声明,而不是方法调用。您不能将类型作为参数传递。 -> Void在这里根本没有意义。你几乎肯定意味着

 self.submitTokenToBackend {

但是,如果您对此有其他疑问,则需要提供我们可以编译的代码(请参阅mcve)并列出确切的错误。 “奇怪的错误”对调试没有特别的帮助。