mac - Código de acceso en Swift 3 Error
swift for mac download (4)
Nuevo en Xcode 8 beta 4,
NSError
se
NSError
al tipo de protocolo Swift
Error
.
Esto afecta a StoreKit cuando se trata de fallidos
SKPaymentTransaction
s.
Debe verificar para asegurarse de que el error no se produjo porque la transacción se canceló para saber si se debe mostrar o no un mensaje de error al usuario.
Para ello, examina el
code
del error.
Pero con
Error
lugar de
NSError
, no hay
code
definido.
No he podido averiguar cómo obtener correctamente el código de
Error
de
Error
.
Esto funcionó en la versión anterior de Swift 3:
func failedTransaction(_ transaction: SKPaymentTransaction) {
if let transactionError = transaction.error {
if transactionError.code != SKErrorCode.paymentCancelled.rawValue {
//show error to user
}
}
...
}
Ahora ese
error
es un
Error
no
NSError
, el
code
no es un miembro.
Ahora en Xcode 8 y swift 3 la conversión condicional siempre tiene éxito, por lo que debe hacer lo siguiente:
let code = (error as NSError).code
y verifique el
code
para sus necesidades.
Espero que esto ayude
Casting to
SKError
parece estar funcionando para mí en xCode 8 y 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
}
No hay necesidad de
rawValue
.
Esto es correcto (las propias pruebas de Apple utilizan este enfoque):
if error._code == SKError.code.paymentCancelled.rawValue { ... }
Por otro lado, la conversión a NSError probablemente quedará obsoleta pronto:
let code = (error as NSError).code // CODE SMELL!!
if code == SKError.code.paymentCancelled.rawValue { ... }
Otra opción para acceder a las propiedades de código y dominio en los tipos de error de Swift 3 es extenderlo de la siguiente manera:
extension Error {
var code: Int { return (self as NSError).code }
var domain: String { return (self as NSError).domain }
}