web-dev-qa-db-fra.com

Accès au code dans Swift 3 Erreur

Nouveau dans Xcode 8 beta 4, NSError est ponté vers le type de protocole Swift Error. Cela affecte StoreKit lorsqu’il s’agit d’un échec de SKPaymentTransactions. Vous devez vérifier que l'erreur ne s'est pas produite parce que la transaction a été annulée pour savoir si un message d'erreur doit être affiché ou non. Vous faites cela en examinant l'erreur code. Mais avec Error au lieu de NSError, il n'y a pas de code défini. Je n'ai pas été capable de comprendre comment obtenir correctement le code d'erreur de Error.

Cela fonctionnait dans la version précédente de Swift 3:

func failedTransaction(_ transaction: SKPaymentTransaction) {
    if let transactionError = transaction.error {
        if transactionError.code != SKErrorCode.paymentCancelled.rawValue {
            //show error to user
        }
     }
     ...
}

Maintenant que error est un Error pas NSError, code n'est pas un membre.

65
Jordan H

Casting to SKError semble fonctionner pour moi dans xCode 8 et 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
    }

Pas besoin de rawValue.

37
Murray Sagal

Une autre option permettant d’accéder au code et aux propriétés du domaine dans Swift 3 Types d’erreur est de l’étendre comme suit:

extension Error {
    var code: Int { return (self as NSError).code }
    var domain: String { return (self as NSError).domain }
}
125
Leo Dabus

Maintenant, dans Xcode 8 et Swift 3, la conversion conditionnelle réussit toujours. Vous devez donc procéder comme suit:

let code = (error as NSError).code

et vérifiez la code pour vos besoins. J'espère que cela t'aides

48
Andrey M.

C'est correct (les propres tests d'Apple utilisent cette approche):

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

Par contre, le casting sur NSError sera probablement bientôt obsolète:

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