Pour déballer un optionnel et le passer à une fonction que j'utilise normalement:
if let theError = optionalError { throw theError }
J'ai maintenant une erreur optionnelle que je voudrais lancer si elle n'est pas nulle:
var optionalError: Error? optionalError.map { throw $0 }
Cela ne fonctionnera pas car la fermeture transmise à la carte ne peut pas être lancée.
Une solution alternative serait d'utiliser le complet si let code> syntaxe:
var optionalInt: Int? optionalInt.map { someFunctionThatTakes(aNonOptional: $0) }
Mais cela utilise le nom de la variable theError
deux fois et est plus sujet aux erreurs que le beau .map code > mise en œuvre.
Quelqu'un connaît-il une manière plus propre de mettre en œuvre cela?
3 Réponses :
Cela ne fonctionnera pas car la fermeture transmise à la carte ne peut pas être lancée.
Ce n'est pas vrai. La fermeture transmise à
if let theError = optionalError { throw theError }peut renvoyer une erreur. Mais cela fait que le
map ()
s'appelle lui-même une expression de (re) lancement, donc il doit être appelé avectry
:var optionalError: Error? // ... try optionalError.map { throw $0 }
si vous n'utilisez pas essayez
devant la méthode de la carte, cela donnera une erreur
L'appel peut être lancé mais n'est pas marqué par "essayer"
À la place, utilisez try
pour générer une erreur.
optionalError.flatMap(throw $0)
Vous peut également utiliser flatMap car il évalue que l'instance facultative de fermeture n'est pas nulle
enum IntParsingError: Error { case overflow case invalidInput(String) } var optionalError: Error? = IntParsingError.overflow do { try optionalError.map { throw $0 } } catch { print(error) }
Mais encore, si let serait le meilleur moyen de gérer une erreur facultative au lieu de map et flatMap.
Vous pouvez créer une extension pour Swift.Error
try error?.throwIfNeeded()
Et l'appeler en cas d'erreur facultative
extension Swift.Error { func throwIfNeeded() throws { throw self } }
Utilisez try devant votre relevé de carte
Je vous suggère d'utiliser si let et guard let pour une manipulation facultative.
belle .map? Je pense que le déballage facultatif est bien meilleur.
Comment vous retrouvez-vous avec une erreur facultative? Cela semble un peu curieux.