Acessando código no Swift 3 Error

Novo no Xcode 8 beta 4, o NSError é vinculado ao tipo de protocolo Swift Error . Isso afeta o StoreKit ao lidar com SKPaymentTransaction com falha. Você deve verificar se o erro não ocorreu porque a transação foi cancelada para saber se deve ou não mostrar uma mensagem de erro ao usuário. Você faz isso examinando o code do erro. Mas com Error vez de NSError , não há code definido. Eu não consegui descobrir como obter corretamente o código de Error de Error .

Isso funcionou na versão anterior do Swift 3:

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

Agora que o error é um Error não NSError , o code não é um membro.

Casting para SKError parece estar funcionando para mim no xCode 8 e no 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 } 

Não há necessidade de rawValue .

Outra opção para acessar propriedades de código e domínio nos tipos de erro do Swift 3 é estendê-lo da seguinte forma:

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

Agora no Xcode 8 e no swift 3 o casting condicional é sempre bem sucedido, então você precisa fazer o seguinte:

 let code = (error as NSError).code 

e verifique o code para suas necessidades. Espero que isto ajude

Isso está correto (os próprios testes da Apple usam essa abordagem):

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

Por outro lado, a conversão para NSError provavelmente será suspensa em breve:

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