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 générée : tu veux simplement un résultat ou une valeur de remplacement. Swift propose deux formes abrégées.
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 « appeler cette chose, donnez-moi une valeur dans tous les cas ».
try! signifie « Je sais que cela ne va pas throw ». Si cela se produit, votre programme plante. Utilisez-le uniquement lorsque vous pouvez prouver que l'appel est sûr ; dans le code courant, préférez try? avec une solution de repli ou le do/catch complet.
Défi
FacileDéfinissez NumError: Error avec un cas bad. Définissez une fonction parseEven(_ s: String) throws -> Int qui lève une erreur et qui :
- lève
.badlorsquesne peut pas être analysé comme unInt, ou lorsque la valeur analysée est impaire - retourne sinon l’entier analysé
Lisez une seule ligne d’entrée : une liste de chaînes séparées par des virgules. Pour chacune d’elles, utilisez try? suivi de ?? -1 afin d’obtenir soit l’entier pair analysé, soit -1.
Affichez, dans l’ordre, les entiers obtenus, reliés par ,. Ensuite, sur une deuxième ligne, affichez le nombre de valeurs qui correspondent à -1.
Pour l’entrée 4,7,abc,8,11,2, la sortie est :
4,-1,-1,8,-1,2
3Essayez vous-même
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum NumError; func parseEven(_:) throws -> Int;
// pour chaque part, (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éeEntraînez-vous par vous-même : Playground Swift