Apple a officiellement lancé Swift 6.4, marquant ainsi une nouvelle avancée significative pour le langage de programmation open source d’Apple. Fournie avec Xcode 27, cette mise à jour privilégie la productivité des développeurs grâce à une série d’améliorations ergonomiques conçues pour fluidifier les workflows quotidiens. Parmi les principales améliorations figure une interopérabilité renforcée entre Swift Testing et XCTest, permettant aux développeurs de migrer progressivement sans avoir à réécrire l’intégralité de leurs suites de tests. Des gains de performances et l’extension des plateformes complètent ces annonces majeures. Swift est un langage de programmation de haut niveau, polyvalent, multiparadigme et compilé, créé par Chris Lattner en 2010 pour Apple Inc. et maintenu par la communauté open source. Swift se compile en code machine et utilise un compilateur basé sur LLVM. Swift a été lancé pour la première fois en juin 2014 et la chaîne d'outils Swift est intégrée à Xcode depuis la version 6 de ce dernier, sortie en septembre 2014.
Apple a conçu Swift pour prendre en charge de nombreux concepts fondamentaux associés à Objective-C, notamment la distribution dynamique, la liaison tardive généralisée, la programmation extensible et d’autres fonctionnalités similaires, mais d’une manière « plus sûre », facilitant ainsi la détection des bogues logiciels ; Swift dispose de fonctionnalités permettant de remédier à certaines erreurs de programmation courantes, comme la déréférence d’un pointeur nul, et fournit des simplifications syntaxiques pour aider à éviter la « pyramide de la mort ». Swift prend en charge le concept d’extensibilité des protocoles, un système d’extensibilité applicable aux types, aux structures et aux classes, qu’Apple présente comme un véritable changement de paradigme de programmation qu’elle qualifie de « programmation orientée protocole » (similaire aux traits et aux classes de types).
Récemment, Apple a officiellement lancé Swift 6.4, marquant ainsi une nouvelle avancée significative pour le langage de programmation open source d’Apple. Fournie avec Xcode 27, cette mise à jour privilégie la productivité des développeurs grâce à une série d’améliorations ergonomiques conçues pour fluidifier les workflows quotidiens. Parmi les principales améliorations figure une interopérabilité renforcée entre Swift Testing et XCTest, permettant aux développeurs de migrer progressivement sans avoir à réécrire l’intégralité de leurs suites de tests. Cette nouvelle version introduit également la prise en charge de l’asynchrone au sein des instructions "defer", garantissant ainsi que le code de nettoyage s’exécute de manière fiable, que la fonction se termine normalement ou qu’elle génère une erreur.
Des gains de performances et l’extension des plateformes complètent ces annonces majeures. La bibliothèque Foundation bénéficie d’optimisations notables, l’analyse des URL s’exécutant, selon les informations disponibles, jusqu’à quatre fois plus rapidement qu’auparavant. Le SDK Swift pour Android évolue avec le nouveau NDK 30 LTS, qui rationalise les processus de compilation et supprime le besoin de scripts post-installation. Swift Embedded continue de mûrir grâce à la prise en charge généralisée des types existentiels et à l’amélioration des métadonnées de débogage, qui permettent de conserver des binaires compacts tout en préservant les diagnostics de plantage. Les versions de débogage sous Linux, Windows et Darwin voient également leur taille considérablement réduite, car les modules binaires Swift ne sont plus intégrés dans les artefacts de débogage.
Cette version renforce encore les ambitions multiplateformes de Swift grâce à une nouvelle infrastructure de documentation : un site dédié à la documentation Swift a été lancé, parallèlement à la mise à disposition en open source du contenu de la documentation de la bibliothèque standard. L’interopérabilité avec le C s’étend dans les deux sens, permettant aux fonctions Swift d’être exposées aux bases de code C. Grâce à un contrôle affiné des avertissements via l’attribut @diagnose et à des vérifications simplifiées de la disponibilité du système d’exploitation à l’aide de la nouvelle syntaxe anyAppleOS, Swift 6.4 s’attaque aux points faibles récurrents auxquels les développeurs expérimentés sont régulièrement confrontés. Le langage vise désormais à couvrir l’ensemble de la pile de développement, des applications mobiles et des serveurs cloud aux systèmes embarqués et aux navigateurs web.
Voici l'annonce de Swift 6.4 :
Présentation Swift 6.4
Swift 6.4 est désormais disponible. Swift se veut un excellent choix à tous les niveaux de la pile, des applications et serveurs au code système, en passant par les appareils embarqués et le navigateur. Cette version renforce encore cette prise en charge et facilite l’écriture du code au quotidien. Voici les principales nouveautés :
- Swift Build est désormais la valeur par défaut dans Swift Package Manager, ce qui permet de compiler vos projets de la même manière sous Linux, macOS et Windows.
- Subprocess atteint la version 1.0, offrant un moyen stable et multiplateforme d’exécuter d’autres programmes et d’interagir avec eux depuis Swift, qu’il s’agisse d’outils en ligne de commande ou de processus de streaming.
- L’interopérabilité s’étend encore davantage : le type Span de Swift établit désormais un pont direct avec std::span de C++20, tandis que l’interopérabilité Swift/Java étend sa prise en charge de l’asynchrone et des callbacks.
- Swift s’exécute plus rapidement dans le navigateur : grâce à JavaScriptKit, l’interfaçage avec WebAssembly est jusqu’à 40 fois plus rapide, et le SDK Wasm est disponible directement sur Swift.org.
- Swift embarqué gagne en capacités, avec la prise en charge des types existentiels et une gestion des erreurs plus complète pour les cibles de type microcontrôleur.
- Les performances s’améliorent tout en préservant la sécurité mémoire, grâce à de nouveaux types de tableaux pouvant contenir des éléments non copiables sans la surcharge liée à la copie à l’écriture, et au nouveau protocole "Iterable" permettant d’itérer sans copies.
Un code plus simple et plus clair
Swift 6.4 rationalise votre programmation au quotidien pour rendre votre code plus simple et plus clair.
- Des types optionnels « some » et « any » plus naturels. Lorsque vous écrivez un type optionnel « some » ou « any », vous n’avez plus besoin d’encadrer le type entre parenthèses. Au lieu de (some Rocket)?, vous pouvez simplement écrire some Rocket?.
- Contrôle au niveau du code source des avertissements du compilateur. Lorsque vous avez besoin de contrôler le comportement des avertissements dans votre projet, par exemple pour les supprimer ou les transformer en erreurs, vous pouvez désormais définir ce comportement directement dans votre code à l’aide du nouvel attribut @diagnose.
- Préciser quelle API utiliser en cas de conflit entre plusieurs bibliothèques. Lorsque plusieurs modules définissent le même nom d’API que vous souhaitez référencer, vous pouvez spécifier le module que vous souhaitez utiliser à l’aide de sélecteurs de module. Si votre application importe deux modules fournissant tous deux un type CommonThing, l’utilisation du sélecteur :: vous permet de préciser clairement lequel des deux vous souhaitez utiliser.
- Appel de fonctions asynchrones dans un bloc defer. Tout code asynchrone que vous écrivez dans un bloc defer est mis en attente et s’exécute jusqu’à son terme avant que le bloc ne se termine.
- Assurez-vous que les opérations de nettoyage nécessaires ne soient pas annulées. Vous pouvez exécuter une fermeture protégée contre l’annulation de la tâche qui l’encadre grâce à l’API withTaskCancellationShield.
Vous pouvez combiner des appels asynchrones dans des blocs `defer` et des protections contre l’annulation pour garantir que les opérations de nettoyage aient toujours lieu, quel que soit le mode de retour de la fonction :
| Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | func processFile(at url: URL) async throws { let handle = try FileHandle(forReadingFrom: url) defer { // flushMetrics is a network call, so it can suspend after cancellation // is requested; the shield ensures it runs to completion and isn't // included in cancellation. await withTaskCancellationShield { await flushMetrics(for: url) try? handle.close() } } try await processContents(of: handle) } |
Des API de la bibliothèque de base plus riches
Les améliorations apportées à Foundation et à la bibliothèque standard facilitent l’utilisation des API modernes avec les types existants.
Par exemple, ProgressManager a ajouté une API pour prendre en charge async/await, et les types @Observable disposent désormais de notifications de changement granulaires et continues.
La bibliothèque Subprocess a atteint la version 1.0. Elle fournit un package multiplateforme permettant d’exécuter des sous-processus et d’interagir avec eux, entièrement conçu à partir de zéro en utilisant la concurrence Swift. L’exemple suivant, tiré du guide « Getting Started with Subprocess », illustre l’exécution d’un processus et la capture de sa sortie.
| Code : | Sélectionner tout |
1 2 3 4 5 6 | let result = try await Subprocess.run( .name("ls"), arguments: ["-la"], output: .string(limit: 4096) ) print(result.standardOutput) |
Swift 6.4 facilite la migration des projets existants vers Swift Testing. Vous pouvez désormais utiliser XCTAssert en toute sécurité dans les tests Swift Testing ou #expect au sein des XCTests, et personnaliser les valeurs affichées dans les attentes ayant échoué à l’aide du protocole CustomTestReflectable. Swift Testing vous permet de répéter des cas de test pour gagner en efficacité et gagner du temps, ainsi que d’enregistrer des pièces jointes conformes au protocole Transferable sur les plateformes Apple.
Swift dispose désormais d’un site de documentation, et le contenu de la documentation relative à la bibliothèque standard est désormais open source.
Compilations plus rapides, débogage plus clair, prise en charge plus étendue des EDI
Swift 6.4 apporte toute une série d’améliorations au niveau des outils qui facilitent le développement au quotidien, du débogage à la compilation en passant par la prise en charge des éditeurs :
- Un débogage plus robuste. Swift 6.4 achève une refonte, étalée sur plusieurs versions, de la manière dont le compilateur suit les modules Swift dans les informations de débogage : LLDB importe désormais les modules grâce à un suivi précis des dépendances, au lieu de recherches ambiguës par nom. Les builds de débogage sous Linux et Windows, ainsi que les paquets dSYM sous Darwin, sont considérablement allégés, car les modules binaires Swift n’y sont plus intégrés. Consultez le récent article de blog « Module Tracking in Swift Debug Info » pour en savoir plus.
- Système de compilation unifié pour tous les EDI. Swift Package Manager (SwiftPM) utilise désormais Swift Build comme plateforme de compilation par défaut et inclut la génération de nomenclatures logicielles (SBOM) pour Swift Package Manager (SE-0509), offrant ainsi la prise en charge de la génération de documents SBOM au format SPDX ou CycloneDX. Pour en savoir plus sur les mises à jour de SwiftPM, consultez les notes de version de SwiftPM 6.4, et découvrez comment générer une SBOM dans la section « Génération d’une nomenclature logicielle (SBOM) ».
- Prise en charge élargie de Swift par les EDI. L’extension VS Code pour Swift est désormais disponible sur l’Open VSX Registry ; elle fonctionne donc non seulement dans VS Code, mais aussi dans Cursor, Antigravity, Kiro et d’autres outils de développement. Elle inclut désormais également une intégration avec Swiftly, ce qui facilite la sélection et l’utilisation de différentes versions des chaînes d’outils Swift dans votre projet.
Interopérabilité et prise en charge des plateformes renforcées
L’interopérabilité de Swift étend sa portée à davantage de niveaux de la pile : du C++ au niveau système au runtime Java d’Android, et de WebAssembly (Wasm) dans le navigateur à Embedded Swift sur les microcontrôleurs.
L’interopérabilité entre les langages est encore renforcée dans cette version.
- C : associez @c à @implementation pour utiliser une fonction Swift afin de fournir l’implémentation d’un en-tête C sans déclaration C distincte. Sans @implementation, le compilateur génère la déclaration dans l’en-tête généré. Dans les deux cas, les fonctions @c peuvent bénéficier de wrappers sécurisés, tels qu’une fonction utilisant Span à la place d’une paire brute pointeur-compteur.
- C++ : Swift 6.4 établit une passerelle entre std::span de C++20 et Span de Swift. Vous pouvez ainsi transmettre un Span à une API C++ qui attend un std::span, et recevoir en retour un std::span sous la forme d’un Span, sans avoir à écrire de code de conversion manuel à la frontière.
- Java : le projet d’interopérabilité Swift/Java, qui permet d’appeler du code Swift depuis Java et Kotlin, étend sa prise en charge des fonctions asynchrones et des fonctions levant des exceptions aux wrappers de protocole et de callback, ajoute un mappage automatique Runnable pour les fermetures, l’importation de paramètres variadiques...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.