访问Swift 3中的代码错误

Jor*_*n H 68 swift swift3

Xcode 8 beta 4中的新功能NSError与Swift Error协议类型相连.这会在处理失败的SKPaymentTransactions 时影响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
        }
     }
     ...
}
Run Code Online (Sandbox Code Playgroud)

现在errorError不是NSError,code是不是成员.

Leo*_*bus 130

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

extension Error {
    var code: Int { return (self as NSError).code }
    var domain: String { return (self as NSError).domain }
}
Run Code Online (Sandbox Code Playgroud)

  • 检查@ murray-sagal的答案,最好使用新提供的SKError,而不是切换回Objective-C对象. (4认同)

And*_* M. 52

现在在Xcode 8和swift 3中,条件转换始终成功,因此您需要执行以下操作:

let code = (error as NSError).code
Run Code Online (Sandbox Code Playgroud)

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


Mur*_*gal 37

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
    }
Run Code Online (Sandbox Code Playgroud)

没必要rawValue.


Rob*_*Rob 10

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

if error._code == SKError.code.paymentCancelled.rawValue { ... }
Run Code Online (Sandbox Code Playgroud)

另一方面,很快就会弃用强制转换为NSError:

let code = (error as NSError).code // CODE SMELL!!
if code == SKError.code.paymentCancelled.rawValue { ... }
Run Code Online (Sandbox Code Playgroud)

  • 您考虑向正确的类转换代码气味,但外部访问下划线成员是好的吗?当然,你应该在`if let`或`guard let`中访问`.code`,而不是盲目地假设演员工作. (7认同)