在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
不是NSError
, code
不是一个成员。
施放到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 { ... }