Быстрое создание объекта NSError
Я пытаюсь создать объект ошибки для отображения пользователю.
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)")
К сожалению, выход:
Error in Post: The operation couldn’t be completed.(ShiploopHttpResponseErrorDomain error 401.)
Я хочу показать пользователю, что он должен активировать свою учетную запись. Любые идеи?
Ответы
Ответ 1
Похоже, вы хотите (см. словарные клавиши):
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: "")
]
Затем создайте объект ошибки как в swift 2, так и в 3:
let err = NSError(domain: "ShiploopHttpResponseErrorDomain", code: 401, userInfo: userInfo)
println("Error in Post: \(err.localizedDescription)")
NSLocalizedDescriptionKey и NSLocalizedFailureReasonErrorKey являются глобальными переменными String и ключами внутри словаря userInfo. Значения немного отличаются от указанных вами:
println(NSLocalizedDescriptionKey) //prints "NSLocalizedDescription"
println(NSLocalizedFailureReasonErrorKey) //prints "NSLocalizedFailureReason"
Я считаю хорошей практикой посмотреть документацию, щелкнув правой кнопкой мыши класс (в этом случае NSError) и выбрав "Переход к определению" в xcode. На все вопросы можно ответить таким образом.:)
Ответ 2
Вот мой метод Помощника, который создает объект NSError с дополнительной информацией о трассировке стека:
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
}
}
Применение:
let error = Helper.error(NSLocalizedString("Unauthorized", comment: "Account not activated"))
Обратите внимание на 3 прокомментированные строки в классе Helper, которые я использую для записи ошибок в Crashlytics, вы можете раскомментировать выше строки и использовать следующее расширение для записи ошибок в Crashlytics:
extension NSError {
func record() {
Crashlytics.sharedInstance().recordError(self)
}
}
Ответ 3
Создание очень простой ошибки в Swift 3:
let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey : "Object does not exist"])