自Swift 3上的Xcode 8 GM起,无法符合STPAddCardViewControllerDelegate

由于使用Xcode 8 GM将我的代码库转换为swift 3,因此在尝试符合STPAddCardViewControllerDelegate (Stripe SDK)时出现此错误。 我对此错误感到非常惊讶,因为即使使用Xcode自动存取这些方法,我也会遇到同样的错误。 类型似乎匹配,不知道发生了什么。

 extension ViewController: STPAddCardViewControllerDelegate { func addCardViewControllerDidCancel(_ addCardViewController: STPAddCardViewController) { } func addCardViewController(_ addCardViewController: STPAddCardViewController, didCreateToken token: STPToken, completion: STPErrorBlock) { } } 

生成此错误

 Type 'ViewController' does not conform to protocol 'STPAddCardViewControllerDelegate' Protocol requires function 'addCardViewController(_:didCreateToken:completion:)' with type '(STPAddCardViewController, STPToken, STPErrorBlock) -> Void'; do you want to add a stub? Candidate has non-matching type '(STPAddCardViewController, STPToken, (Error?) -> Void) -> ()' 

这是协议的定义

 public protocol STPAddCardViewControllerDelegate : NSObjectProtocol { public func addCardViewControllerDidCancel(_ addCardViewController: STPAddCardViewController) public func addCardViewController(_ addCardViewController: STPAddCardViewController, didCreateToken token: STPToken, completion: Stripe.STPErrorBlock) } 

我在这里想念的是什么?

经过@AliSoftware和@bdorfman在相关Stripe SDK问题上的一些调查后,发现将@escaping属性添加到completion参数可以解决问题。

它似乎是swift结束时的编译器和存根问题,目前正在跟踪: https : //bugs.swift.org/browse/SR-2596 。