try? et try!
Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 46 sur 56.
Parfois, peu importe l'erreur qu'une fonction a levée, vous voulez simplement un résultat ou une solution de repli. Swift vous propose deux formes courtes.
try? transforme toute erreur levée en nil. Le résultat est un Optional du type de retour de la fonction :
enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }
let result = try? risky() // nil
let safe = (try? risky()) ?? 0 // 0Associez-le à ?? pour une valeur par défaut en ligne. C'est la version la plus courte de « appelez cet élément, donnez-moi une valeur dans tous les cas ».
try! dit « Je sais que cela ne lèvera pas d'erreur ». Si c'est le cas, votre programme plante. Utilisez-le uniquement lorsque vous pouvez prouver que l'appel est sûr ; dans le code de tous les jours, préférez try? avec une solution de repli ou le bloc complet do/catch.
Défi
FacileDéfinissez NumError: Error avec un cas bad. Définissez une fonction lançant une erreur parseEven(_ s: String) throws -> Int qui :
- Lance
.badlorsquesne peut pas être analysé comme unInt, ou lorsque la valeur analysée est impaire - Sinon, retourne l'entier analysé
Lisez une seule ligne d'entrée : une liste de chaînes de caractères séparées par des virgules. Pour chacune d'elles, utilisez try? suivi de ?? -1 pour obtenir soit l'entier pair analysé, soit -1.
Affichez, dans l'ordre, les entiers résultants joints par ,. Ensuite, sur une deuxième ligne, affichez le nombre de valeurs qui ont renvoyé -1.
Pour l'entrée 4,7,abc,8,11,2, la sortie est :
4,-1,-1,8,-1,2
3Aide-mémoire
try? convertit une erreur levée en nil, retournant un Optional :
let result = try? risky() // nil si une erreur est levée
let safe = (try? risky()) ?? 0 // valeur de replitry! provoque un plantage si l'appel lève une erreur — à n'utiliser que lorsque l'appel est garanti sûr :
let value = try! guaranteedSafe()Essayez vous-même
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum NumError; func parseEven(_:) throws -> Int;
// pour chaque partie, (try? parseEven(part)) ?? -1
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et Flux
1Les chaînes de caractères en profondeur
Comptage et indicesCasse et nettoyageRecherche dans les chaînesDécoupage et jointureRemplacement de sous-chaînesRécapitulatif - Vérification du nom d'utilisateur4Ensembles
Création d'ensemblesUnion et intersectionSoustraction et différence symétriqueSous-ensemble et sur-ensembleRécapitulatif - Filtre de tags7Projet - Suivi d'habitudes
Aperçu du projetMarquer comme terminé10Projet - Moteur de quiz
Présentation du projetPoser des questions2Intervalles et Pas
Fermé vs Semi-ouvertLe PasMéthodes d'intervalleIntervalles dans un SwitchRécapitulatif - Grille de calendrier5Fonctions d'ordre supérieur, Partie 1
MapFilterReduceChaînage de map, filter, reduceRécapitulatif - Statistiques de mots3Dictionnaires
Déclarer des dictionnairesRecherche optionnelleMettre à jour des dictionnairesParcourir des dictionnairesGrouper des valeursRécapitulatif - Inventaire6Fonctions d'ordre supérieur, partie 2
compactMapflatMapsorted(by:)Construction de pipelinesRécapitulatif - Tableau de classement9Gestion des erreurs
throws et Errordo, try, catchtry? et try!Propagation des erreursRécapitulatif - Calculatrice sécurisée