Bien que Swift intègre de nombreuses fonctionnalités dans sa bibliothèque standard, on peut en ajouter beaucoup d'autres en important des bibliothèques et des frameworks externes. Ces modules peuvent provenir directement du projet Swift (comme le Swift Argument Parser), des frameworks des plateformes Apple (comme Foundation et le Network Framework), ou de bibliothèques open source tierces (comme SwiftyBeaver).
Les modules essentiels comme Foundation, l'une des bibliothèques les plus utilisées en Swift, sont fournis avec la chaîne d'outils Swift. Les bibliothèques tierces doivent être ajoutées à la configuration du projet (par exemple avec Swift Package Manager) avant de pouvoir être importées.
Pour importer des modules, on écrit le mot-clé import suivi du nom du module. On peut donc importer Foundation en ajoutant ce qui suit à son programme.
import Foundation
Importer un module rend ses types, ses méthodes et ses fonctions disponibles dans ton code.
Par exemple, importer Foundation dote String de méthodes utilitaires pratiques comme components(separatedBy:).
Par convention, les instructions import se placent en haut d'un fichier Swift, afin que les dépendances soient immédiatement visibles pour quiconque lit le code.
On peut accéder aux caractères individuels d'un String en utilisant la syntaxe d'indice employée avec les tableaux.
Cependant, les indices utilisés pour les string ne sont pas des entiers et ne peuvent pas être manipulés directement.
Il faut à la place les calculer à partir d'un autre indice connu, comme startIndex, qui pointe vers la position du premier caractère d'une string non vide, en utilisant les méthodes disponibles dans les bibliothèques String et NSString (quand le module Foundation est importé, les string en Swift ont accès à toutes les propriétés et méthodes de NSString).
Par exemple, étant donné la string suivante :
let csv = "apple,pear,peach,orange,cherry,lime,goosberry"
On ne peut pas écrire csv[21] pour obtenir le « g » de « orange » ; il faut à la place calculer une valeur de type String.Index et fournir cet indice.
À noter que ces indices ne sont pas destinés à être lus par un humain tels quels.
On parle d'indices opaques, car un humain n'a pas besoin de savoir ce qu'ils contiennent.
let index = csv.index(csv.startIndex, offsetBy: 21)
csv[index]
// "g"
print(index)
// prints Index(_rawBits: 1376513)
Note cependant que si le décalage ne correspond pas à un indice valide, c'est-à-dire s'il donne un indice avant startIndex ou après endIndex, l'opération lèvera une erreur et fera planter le programme.
Pour éviter ce problème, on peut spécifier un indice limite.
La méthode renvoie alors un indice optionnel, et elle renvoie nil pour les indices qui seraient autrement invalides.
let tooFar = csv.index(csv.startIndex, offsetBy: 200)
// error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
let tooFarButSafe = csv.index(csv.startIndex, offsetBy: 200, limitedBy: csv.endIndex)
// nil
De plus, les indices ne peuvent pas être partagés entre plusieurs string.
Par exemple, utiliser l'index du « g » de « orange » calculé plus haut pour indexer la string fam = "This is my family: 👨👩👦👦, this is our dog: 🐶, this is our cat: 🐱!", c'est-à-dire fam[index], fera planter le programme.
Les raisons à tout cela sont nombreuses, mais elles se résument toutes à « Unicode, c'est délicat ».
D'une manière générale, si tu as besoin d'accéder de façon aléatoire à des caractères individuels, tu as probablement intérêt à utiliser une autre structure de données, comme Array<Character>.
Swift dispose des méthodes first et last pour obtenir le premier et le dernier caractère d'une string.
Ces méthodes renvoient un caractère optionnel ; si la string est vide, elles renvoient donc nil.
let str = "Hello, world!"
print(str.first) // Prints Optional("H")
print(str.last) // Prints Optional("!")
Tu peux aussi utiliser les méthodes prefix et suffix pour obtenir une sous-chaîne d'une string.
Ces méthodes prennent un entier en argument et renvoient une sous-chaîne contenant les n premiers ou derniers caractères de la string.
let str = "Hello, world!"
print(str.prefix(5)) // Prints "Hello"
print(str.suffix(6)) // Prints "world!"
Travailler avec du texte est une tâche courante en programmation. Swift, tout comme le framework Foundation, fournit de nombreuses méthodes et propriétés pratiques pour inspecter, transformer et manipuler les string.
components(separatedBy:)
Pour découper une string en un tableau de sous-chaînes à partir d'un délimiteur, utilise components(separatedBy:) (nécessite d'importer Foundation) :
import Foundation
let sentence = "Hello, world!"
let words = sentence.components(separatedBy: " ")
print(words) // Prints ["Hello,", "world!"]
hasPrefix(_:) et hasSuffix(_:)
Pour vérifier si une string commence ou se termine par une suite de caractères donnée, utilise hasPrefix(_:) et hasSuffix(_:) :
let greeting = "Hello, world!"
print(greeting.hasPrefix("Hello")) // Prints true
print(greeting.hasSuffix("world!")) // Prints true
Tu peux transformer la casse d'une string à l'aide de ces méthodes et propriétés standard :
lowercased() : renvoie une copie de la string en minuscules.uppercased() : renvoie une copie de la string en majuscules.capitalized : renvoie une copie où la première lettre de chaque mot est en majuscule (fournie par Foundation).let greeting = "hello, world!"
print(greeting.lowercased()) // Prints "hello, world!"
print(greeting.uppercased()) // Prints "HELLO, WORLD!"
print(greeting.capitalized) // Prints "Hello, World!"
replacingOccurrences(of:with:)
Pour remplacer toutes les occurrences d'une sous-chaîne cible par une autre string, utilise replacingOccurrences(of:with:) (fournie par Foundation) :
let greeting = "Hello, world!"
let updated = greeting.replacingOccurrences(of: "world", with: "Swift")
print(updated) // Prints "Hello, Swift!"
joined(separator:)
La méthode joined(separator:) appartient aux collections de strings, comme [String].
Elle joint les éléments entre eux en une seule string à l'aide d'un séparateur :
let words = ["Hello", "world"]
let sentence = words.joined(separator: ", ")
print(sentence) // Prints "Hello, world"
Un nouveau club de poésie a ouvert en ville, et tu envisages d'y aller. Comme il y a eu des incidents par le passé, le club applique une politique de porte très particulière que tu devras maîtriser avant de tenter d'entrer.
Il y a deux portes au club de poésie, et toutes les deux sont gardées. Pour pouvoir entrer, tu devras trouver le mot de passe du jour :
La première chose à faire est de découper le poème en lignes individuelles. Le gardien récitera un poème, et tu devras le découper en lignes.
Implémente la fonction splitOnNewlines qui prend une string et la découpe en un tableau de strings, en utilisant le caractère de nouvelle ligne comme séparateur.
La fonction doit renvoyer un tableau de strings, où chaque string est une ligne du poème.
splitOnNewlines("Hello.\nHow are you?\n\nI'm doing fine.")
// returns ["Hello." ,"How are you?", "", "I'm doing fine"].
_ à la place.Par exemple, l'un de leurs écrivains préférés est Michael Lockwood, qui a écrit le poème acrostiche suivant, ce qui signifie que la première lettre de chaque phrase forme un mot :
Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave
Quand le gardien récite le poème, tu le découpes en lignes individuelles et tu réponds avec la première lettre de chaque ligne, c'est-à-dire ["S", "H", "I", "R", "E"].
Le gardien te donnera alors le mot formé par le tableau de lettres que tu as fourni, et tu devras le mettre sous forme capitalisée.
Finalement, le mot de passe que tu renvoies est "SHIRE", et tu pourras entrer.
Implémente la fonction frontDoorPassword qui prend une string représentant le poème.
La fonction doit renvoyer le mot de passe que tu donnerais au gardien.
frontDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "SHIRE"
À l'arrière du club, tu trouveras les poètes les plus renommés, une sorte d'espace VIP. Comme ce n'est pas donné à tout le monde, le processus de la porte de derrière est un peu plus tortueux.
", please" à la fin du mot formé par les lettres.Par exemple, le poème mentionné précédemment est aussi un télestiche, ce qui signifie que la dernière lettre de chaque phrase forme un mot :
Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave
Quand le gardien récite le poème, tu le découpes en lignes individuelles, tu retires les espaces en fin de ligne et tu réponds avec les premières lettres de chaque ligne, c'est-à-dire ["h", "o", "r", "s", "e"].
Le gardien te donnera alors le mot formé par le tableau de lettres que tu as fourni, et tu devras le mettre sous forme capitalisée et ajouter ", please".
Finalement, le mot de passe que tu renvoies est "horse, please", et tu pourras entrer.
Implémente la fonction backDoorPassword qui prend une string représentant le poème.
La fonction doit renvoyer le mot de passe que tu donnerais au gardien.
backDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "horse, please"
À l'intérieur de l'arrière-salle du club se trouve une autre porte qui mène à la salle secrète, où seuls les tout meilleurs poètes peuvent entrer.
"!" à la fin du mot formé par les lettres.Par exemple, une version modifiée du poème mentionné précédemment correspond à ce schéma :
Stands so high
Huge hooves too
Impatiently waits for
Rider with harness
Eager to leave
Quand le gardien récite le poème, tu le découpes en lignes individuelles, tu retires les espaces en fin de ligne et tu réponds avec les ième lettres de chaque ligne, c'est-à-dire ["S", "u", "p", "e", "r"].
Le gardien te donnera alors le mot formé par le tableau de lettres que tu as fourni, et tu devras le mettre en majuscules et ajouter "!".
Finalement, le mot de passe que tu renvoies est SUPER!, et tu pourras entrer.
Implémente la fonction secretRoomPassword qui prend une string représentant le poème.
La fonction doit renvoyer le mot de passe que tu donnerais au gardien.
secretRoomPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nRider with harness\nEager to leave")
// returns "SUPER!"
Inscris-toi sur Exercism pour apprendre et maîtriser Swift avec 35 concepts116 exercices, et un vrai mentorat humain, le tout gratuitement.