在 Swift 3错误中访问代码

新的 Xcode 8 beta 4,NSError是桥接到 Swift Error协议类型。当处理失败的 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
}
}
...
}

既然 errorError而不是 NSError,那么 code就不是成员。

52049 次浏览

访问 Swift 3 Error 类型中的代码和域属性的另一个选项是扩展它,如下所示:

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为您的需要。希望这有所帮助

在 xCode8和 Swift 3中,对 SKError的选角似乎对我很有效... ..。

    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

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

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

另一方面,使用 NSERror 可能很快就会被淘汰:

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

使用

取消

来匹配错误代码。

很多事情都在改变,下面是 Xcode 11的更新。

如果让 skError = transaction.error 作为 打印(“取消”) }