Подтвердить что ты не робот

Быстрое создание объекта 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.) 

Я хочу показать пользователю, что он должен активировать свою учетную запись. Любые идеи?

4b9b3361

Ответ 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"])