Expected Type Before / After —>, Expected Declaration in Swift 3
Expected Type Before / After —>, Expected Declaration in Swift 3
因此,我创建了一个类型别名来存储完成处理程序,稍后使用 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 中收到这些奇怪的错误,涉及我的完成处理程序没有预期的类型。也不是孤立事件。有什么想法吗?
我不确定,但是... 'CompletionHandler' 实现在哪里?据我了解,您只是在 Objective - C ('typedef void (^completionHandler)(id token);') 中声明了一些 like 块,但不要使用它。
self.submitTokenToBackend(completionHandler: CompletionHandler) -> Void {
这是声明,不是方法调用。您不能将类型别名作为参数传递。 -> Void
在这里根本没有意义。你几乎肯定是指
self.submitTokenToBackend {
但是,如果您对此有进一步的疑问,则需要提供我们可以编译的代码(参见 mcve)并列出确切的错误。 "Weird errors" 对调试不是特别有用。
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")
}
}
你的代码与以上三者相去甚远。
因此,我创建了一个类型别名来存储完成处理程序,稍后使用 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 中收到这些奇怪的错误,涉及我的完成处理程序没有预期的类型。也不是孤立事件。有什么想法吗?
我不确定,但是... 'CompletionHandler' 实现在哪里?据我了解,您只是在 Objective - C ('typedef void (^completionHandler)(id token);') 中声明了一些 like 块,但不要使用它。
self.submitTokenToBackend(completionHandler: CompletionHandler) -> Void {
这是声明,不是方法调用。您不能将类型别名作为参数传递。 -> Void
在这里根本没有意义。你几乎肯定是指
self.submitTokenToBackend {
但是,如果您对此有进一步的疑问,则需要提供我们可以编译的代码(参见 mcve)并列出确切的错误。 "Weird errors" 对调试不是特别有用。
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")
}
}
你的代码与以上三者相去甚远。