在Swift 3错误中访问代码

在Xcode 8 beta 4中, NSError被桥接到Swift Error协议types。 这在处理失败的SKPaymentTransaction时会影响StoreKit。 您应该检查以确保没有发生错误,因为事务被取消以知道是否向用户显示错误消息。 你通过检查错误的code来做到这一点。 但与Error而不是NSError ,没有定义的code 。 我一直无法弄清楚如何从Error正确得到错误代码。

这在Swift 3的早期版本中起作用:

 func failedTransaction(_ transaction: SKPaymentTransaction) { if let transactionError = transaction.error { if transactionError.code != SKErrorCode.paymentCancelled.rawValue { //show error to user } } ... } 

现在, error是一个Error不是NSErrorcode不是一个成员。

施放到SKError似乎在xCode 8和Swift 3中为我工作…

  guard let error = transaction.error as? SKError else {return} switch error.code { // https://developer.apple.com/reference/storekit/skerror.code case .unknown: break case .paymentCancelled: break case .clientInvalid: break case .paymentInvalid: break case .paymentNotAllowed: break case .cloudServiceNetworkConnectionFailed: break case .cloudServicePermissionDenied: break case .storeProductNotAvailable: break } 

不需要rawValue

在Swift 3错误types中访问代码和域属性的另一个选项是将其扩展如下:

 extension Error { var code: Int { return (self as NSError).code } var domain: String { return (self as NSError).domain } } 

现在在Xcode 8和Swift 3中,条件转换总是成功的,所以你需要做以下操作:

 let code = (error as NSError).code 

并检查您的需求的code 。 希望这可以帮助

这是正确的(苹果自己的testing使用这种方法):

 if error._code == SKError.code.paymentCancelled.rawValue { ... } 

另一方面,投向NSError很快就会被弃用:

 let code = (error as NSError).code // CODE SMELL!! if code == SKError.code.paymentCancelled.rawValue { ... }