【问题标题】:Expected Type Before / After —>, Expected Declaration in Swift 3预期类型之前/之后 ->,Swift 3 中的预期声明
【发布时间】:2016-12-28 08:39:15
【问题描述】:

因此,我创建了一个类型别名来存储完成处理程序,以便稍后使用 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 中遇到了这些奇怪的错误,这些错误涉及我的完成处理程序没有预期的类型。也不是孤立事件。有什么想法吗?

【问题讨论】:

    标签: ios token stripe-payments swift3 completionhandler


    【解决方案1】:
    self.submitTokenToBackend(completionHandler: CompletionHandler) -> Void {
    

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

    self.submitTokenToBackend {
    

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

    【讨论】:

    • 嗨,罗伯。带有完成处理程序的 submitTokenToBackend 函数接受 Completion Handler 的参数,即前面声明的 typealias typealias CompletionHandler = (_ token: AnyObject?, _ error: NSError?) -> Void 我应该传入什么如果不是完成处理程序? typealias 的参数?那岂不是失去了意义?
    • 只是做 self.submitTokenToBackend { 会引发异常闭包参数列表的上下文类型需要 2 个参数,不能隐式忽略 , in 这会引发错误一行上的连续语句必须用“;”分隔预期表达式
    【解决方案2】:

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

    您的代码与上述三者相差甚远。

    【讨论】:

      【解决方案3】:

      我不确定,但是...“CompletionHandler”的实现在哪里?据我了解,您只需在 Objective-C 中声明一些类似的块('typedef void (^completionHandler)(id token);'),但不要使用它。

      【讨论】:

      • @OOper 是的。我正要接受 Rob Napier 的回答。我没有对处理程序做任何事情,并且在理解我声明处理程序而没有传递任何内容之后“自己”弄清楚了。不确定我是否说对了,但使用了尾随闭包,我让它工作了!谢谢大家!
      猜你喜欢
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2014-06-08
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多