Comme décrit dans les notes de version de Xcode 8 beta 6,
Les types d'erreur définis par Swift peuvent fournir des descriptions d'erreurs localisées en adoptant le nouveau protocole LocalizedError.
Dans ton cas:
public enum MyError: Error {
case customError
}
extension MyError: LocalizedError {
public var errorDescription: String? {
switch self {
case .customError:
return NSLocalizedString("A user-friendly description of the error.", comment: "My error")
}
}
}
let error: Error = MyError.customError
print(error.localizedDescription) // A user-friendly description of the error.
Vous pouvez fournir encore plus d'informations si l'erreur est convertie en NSError
(ce qui est toujours possible):
extension MyError : LocalizedError {
public var errorDescription: String? {
switch self {
case .customError:
return NSLocalizedString("I failed.", comment: "")
}
}
public var failureReason: String? {
switch self {
case .customError:
return NSLocalizedString("I don't know why.", comment: "")
}
}
public var recoverySuggestion: String? {
switch self {
case .customError:
return NSLocalizedString("Switch it off and on again.", comment: "")
}
}
}
let error = MyError.customError as NSError
print(error.localizedDescription) // I failed.
print(error.localizedFailureReason) // Optional("I don\'t know why.")
print(error.localizedRecoverySuggestion) // Optional("Switch it off and on again.")
En adoptant le CustomNSError
protocole, l'erreur peut fournir un userInfo
dictionnaire (et aussi un domain
et code
). Exemple:
extension MyError: CustomNSError {
public static var errorDomain: String {
return "myDomain"
}
public var errorCode: Int {
switch self {
case .customError:
return 999
}
}
public var errorUserInfo: [String : Any] {
switch self {
case .customError:
return [ "line": 13]
}
}
}
let error = MyError.customError as NSError
if let line = error.userInfo["line"] as? Int {
print("Error in line", line) // Error in line 13
}
print(error.code) // 999
print(error.domain) // myDomain
MyError
uneError
première et la prolongez avecLocalizedError
plus tard? Y a-t-il une différence si vous en avez fait unLocalizedError
en premier lieu?var errorDescription: String?
au lieu deString
. Il y a un bogue dans l'implémentation de LocalizedError. Voir SR-5858 .J'ajouterais également, si votre erreur a des paramètres comme celui-ci
vous pouvez appeler ces paramètres dans votre description localisée comme ceci:
Vous pouvez même raccourcir ceci comme ceci:
la source
Il existe maintenant deux protocoles adoptant les erreurs que votre type d'erreur peut adopter afin de fournir des informations supplémentaires à Objective-C - LocalizedError et CustomNSError. Voici un exemple d'erreur qui les adopte tous les deux:
la source
L'utilisation d'une structure peut être une alternative. Un peu d'élégance avec une localisation statique:
la source
Voici une solution plus élégante:
la source
"Bad entry in file – Argument is not a literal string"
erreur lorsque vous exécutezexportLocalizations
ougenstrings
pour créer votre liste de texte traduisible.switch + case
n'est qu'une option ...