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
}
}
...
}
现在error
是Error
而非NSError
,code
不是会员。
答案 0 :(得分:114)
在Swift 3错误类型中访问代码和域属性的另一个选项是将其扩展如下:
extension Error {
var code: Int { return (self as NSError).code }
var domain: String { return (self as NSError).domain }
}
答案 1 :(得分:46)
现在在Xcode 8和swift 3中,条件转换始终成功,因此您需要执行以下操作:
let code = (error as NSError).code
并根据您的需要查看code
。希望这有帮助
答案 2 :(得分:35)
在xCode 8和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
。
答案 3 :(得分:9)
这是正确的(Apple自己的测试使用这种方法):
if error._code == SKError.code.paymentCancelled.rawValue { ... }
另一方面,很快就会弃用强制转换为NSError:
let code = (error as NSError).code // CODE SMELL!!
if code == SKError.code.paymentCancelled.rawValue { ... }
答案 4 :(得分:0)
使用
error._code == NSURLErrorCancelled
以匹配错误代码。
答案 5 :(得分:0)
很多变化。这是Xcode 11的更新。
if let skError = transaction.error as? SKError, skError.code == .paymentCancelled {
print("Cancelled")
}