ios - Swift creando NSError Object
(3)
Aquí está mi método de ayuda, que crea un objeto NSError con alguna información de seguimiento de pila adicional:
class Helper {
static let errorDomain = "com.example.error"
static let errorFuncKey = "com.example.error.function"
static let errorFileKey = "com.example.error.file"
static let errorLineKey = "com.example.error.line"
static func error(_ message: String, record: Bool = true, function: String = #function, file: String = #file, line: Int = #line) -> NSError {
let customError = NSError(domain: errorDomain, code: 0, userInfo: [
NSLocalizedDescriptionKey: message,
errorFuncKey: function,
errorFileKey: file,
errorLineKey: line
])
// if (record) {
// customError.record()
// }
return customError
}
}
Uso:
let error = Helper.error(NSLocalizedString("Unauthorized", comment: "Account not activated"))
Observe las 3 líneas comentadas en la clase de ayuda, esto lo uso para registrar errores en Crashlytics, puede descomentar las líneas anteriores y usar la siguiente extensión para registrar errores en Crashlytics:
extension NSError {
func record() {
Crashlytics.sharedInstance().recordError(self)
}
}
Estoy tratando de crear un objeto de error para mostrar al usuario.
let userInfo: [NSObject : AnyObject] =
[
"NSLocalizedDescriptionKey" : NSLocalizedString("Unauthorized", comment: ""),
"NSLocalizedFailureReasonErrorKey" : NSLocalizedString("Unauthorized", comment: "")
]
let err = NSError(domain: "ShiploopHttpResponseErrorDomain", code: httpResponse.statusCode, userInfo: userInfo)
print("Error in Post: /(err.localizedDescription)")
Desafortunadamente la salida es:
Error in Post: The operation couldn’t be completed.(ShiploopHttpResponseErrorDomain error 401.)
Quiero poder mostrarle al usuario que debe activar su cuenta. ¿¿Algunas ideas??
Creando un error muy simple en Swift 3:
let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey : "Object does not exist"])
Parece que quieres (ver las claves del diccionario):
Swift 2
let userInfo: [NSObject : AnyObject] =
[
NSLocalizedDescriptionKey : NSLocalizedString("Unauthorized", value: "Please activate your account", comment: ""),
NSLocalizedFailureReasonErrorKey : NSLocalizedString("Unauthorized", value: "Account not activated", comment: "")
]
Swift 3
let userInfo: [AnyHashable : Any] =
[
NSLocalizedDescriptionKey : NSLocalizedString("Unauthorized", value: "Please activate your account", comment: "") ,
NSLocalizedFailureReasonErrorKey : NSLocalizedString("Unauthorized", value: "Account not activated", comment: "")
]
Luego crea el objeto de error en swift 2 o 3 de esta manera:
let err = NSError(domain: "ShiploopHttpResponseErrorDomain", code: 401, userInfo: userInfo)
println("Error in Post: /(err.localizedDescription)")
NSLocalizedDescriptionKey y NSLocalizedFailureReasonErrorKey son variables de cadena globales y las claves dentro del diccionario de información de usuario. Los valores son ligeramente diferentes de lo que especificaste:
println(NSLocalizedDescriptionKey) //prints "NSLocalizedDescription"
println(NSLocalizedFailureReasonErrorKey) //prints "NSLocalizedFailureReason"
Me parece una buena práctica consultar la documentación haciendo clic con el botón derecho en la clase (NSError en este caso) y seleccionando "Saltar a definición" dentro de xcode. Todo tipo de preguntas pueden ser respondidas de esta manera. :)