访问Swift 3中的代码错误

时间:2016-08-02 03:21:32

标签: swift swift3

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而非NSErrorcode不是会员。

6 个答案:

答案 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") }