Я думаю, что вам не хватает правильного подхода.
Вам не нужно локализовать сетевую ошибку низкого уровня как:
- обычно бесполезны для конечного пользователя
- удобно разрабатывать, а не показывать (вы можете в конечном итоге зарегистрировать их ..)
- когда вы получили код, измените его в удобочитаемом родовом сообщении, а затем локализуйте его.
Для III пункта:
final private func downloadMyData(){
guard let myURL = URL(string: "__https://ingconti.com/wrongurl") else{
return
}
let session = URLSession.shared
let task = session.dataTask(with: myURL) { (data: Data?, response: URLResponse?, error: Error?) in
// session cannot be created...
if let error = error {
self.manageLowLevel(error: error)
return
}
var statusCode: Int = 0
if let httpResponse : HTTPURLResponse = response as? HTTPURLResponse{
statusCode = httpResponse.statusCode
}
if 200 ... 299 ~= statusCode {
self.parse(data: data)
}else{
self.manageHTTPError(code: statusCode, data: data)
}
}
task.resume()
}
Если вы получили БОЛЬШУЮ ошибку (например, в моем коде я использовал неправильный префикс "__https")
Вы получите _code = -1022,
и вы можете управлять следующим образом:
final private func manageLowLevel(error: Error){
#if DEBUG
print(error)
#endif
var msg = ""
let code = error._code
switch code {
case -1002:
msg = localized("GENERIC_NETWORK_ERR")
default:
msg = localized("GENERIC_NETWORK_ERR")
}
// display msg... (on MAIN THREAD...)
}
func localized(_ msg: String)->String{
let s = NSLocalizedString(msg, comment : "")
return s
}
Где Вы можете замаскировать сообщение для конечного пользователя и сделать его более общим (и локализованным с помощью вспомогательной функции "localized")
Для ошибки HTTP (например, не найден ресурс ... т.е. "https://ingconti.com/wrongurl") Вы получите ошибку 404 в http / s.
Так что вы можете сделать подобное:
final private func manageHTTPError (код: Int, данные: Data?) {
охранник пусть данные = данные еще {
вернуть
}
#if DEBUG
if let s = String(data: data, encoding: .utf8){
print(s)
}else{
if let s = String(data: data, encoding: .ascii){
print(s)
}
}
#endif
var msg = ""
switch code {
case 404:
msg = localized("NETWORK_CODE_404")
default:
msg = localized("GENERIC_NETWORK_ERR")
}
// display msg...
}
Или даже объединены вместе.
(строка s в
# если отладка
если пусть s = .....
покажет ошибку сервера и снова не покажет пользователю ...)
Подводя итог:
чтобы не показывать ошибку низкого уровня, см. мягкое сообщение, поэтому, например, у вас есть локализованные строки:
"GENERIC_NETWORK_ERR" = "Ошибка сети";
"NETWORK_CODE_404". = "Ошибка сети (нет данных)";
и по-испански ...
"GENERIC_NETWORK_ERR" = "ошибка красного цвета";
...
Надеюсь, это поможет.