
De nouveaux codes bĂȘta pour Xcode, macOS Mojave et iOS ont Ă©tĂ© publiĂ©s - et voici les points clĂ©s que j'ai appris.
Swift 5 pour Xcode 10.2 beta
Rapide
Tout d'abord, la derniĂšre version bĂȘta de Xcode est livrĂ©e avec la nouvelle version de Swift:
Apple Swift 5.0 (swiftlang-1001.0.45.7 clang-1001.0.37.7)
Target: x86_64-apple-darwin18.2.0
ABI version: 0.6
Commençons par les nouvelles les plus excitantes:
Les applications Swift n'incluent plus de DLL pour la bibliothÚque standard Swift et la superposition Swift SDK dans les versions pour les appareils iOS 12.2, watchOS 5.2 et tvOS 12.2. Par conséquent, les applications Swift sont de taille réduite lorsqu'elles sont déployées pour les tests dans TestFlight ou lors de la compression d'une archive pour une distribution.
ABI va enfin devenir stable, et c'est une excellente nouvelle. Ă mon avis, c'est aujourd'hui l'un des problĂšmes clĂ©s de Swift - non pas Ă cause des effets secondaires, mais Ă cause des promesses non tenues. Certains de mes amis réécrivent mĂȘme des extensions pour Apple Watch sur Objective-C pour rĂ©duire la taille du fichier binaire (d'environ 15 Mo Ă 1 Mo). Vous pouvez en savoir plus sur le statut ABI via les liens:
Swift ABI Dashboard et Swift ABI Manifesto of Stability .
L'attribut @dynamicCallable vous permet d'appeler des types nommés comme des fonctions avec du sucre syntaxique simple. L'objectif principal est d'assurer la compatibilité avec les langages dynamiques. ( SE-0216 )
Un exemple:
@dynamicCallable struct ToyCallable { func dynamicallyCall(withArguments: [Int]) {} func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, Int>) {} } let x = ToyCallable() x(1, 2, 3) // Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])` x(label: 1, 2) // Desugars to `x.dynamicallyCall(withKeywordArguments: ["label": 1, "": 2])
Ce sujet est assez vaste et l'innovation me fait des sentiments mitigés. Paul Hudson a pu en parler d'un point de vue neutre dans l'article «
Quoi de neuf dans Swift 5.0 ».
Le mode de compatibilité Swift 3 est exclu. Les valeurs prises en charge pour l' -swift-version
sont 4, 4.2 et 5.
L'Úre s'en va: la compatibilité au niveau de la source avec Swift 3 n'est plus. Cette étape était attendue, elle a été annoncée dans la feuille de route de Swift 5, et pourtant. Je recommande fortement de rafraßchir votre mémoire en lisant le
processus de publication de Swift 5.0 . Swift 5 est là - préparez-vous.
En mode Swift 5, les instructions switch sur les Ă©numĂ©rations dĂ©clarĂ©es dans Objective-C ou provenant de frameworks systĂšme doivent traiter des valeurs inconnues - c'est-Ă -dire celles qui peuvent ĂȘtre ajoutĂ©es Ă l'avenir ou qui peuvent ĂȘtre dĂ©finies sĂ©parĂ©ment dans le fichier d'implĂ©mentation d'Objective-C.
Formellement, Objective-C vous permet d'inclure n'importe quelle valeur dans l'Ă©numĂ©ration si elle correspond au type de base. Ces cas inconnus peuvent ĂȘtre traitĂ©s par le nouveau cas @unknown default
@ @unknown default
, qui donne toujours un avertissement si des cas connus dans le commutateur sont manquĂ©s. Ils peuvent Ă©galement ĂȘtre contrĂŽlĂ©s en utilisant la default
habituelle. Si vous avez spécifié une énumération dans Objective-C et que vous ne souhaitez pas que les clients doivent traiter des valeurs inconnues, utilisez la macro NS_CLOSED_ENUM
au lieu de NS_ENUM
. Le compilateur Swift le reconnaßt et ne nécessite pas de spécifier la default
par default
dans l'instruction switch.
Dans les modes Swift 4 et 4.2, vous pouvez également utiliser @unknown default
. Si cela n'est pas fait et qu'une valeur inconnue est manquée dans le commutateur, le programme sera interrompu - tout comme il l'était dans Swift 4.2 et Xcode 10.1 ( SE-0192 )
Il s'agit d'un problÚme de longue date qui cause toujours des inconvénients, surtout si vous préférez ne pas définir de commutateurs
default
dans les commutateurs. Je me souviens du tourment que j'ai reçu de l'option
.provisional
est apparue dans iOS 12 dans le type
UNAuthorizationOptions
. Maintenant, avec l'introduction d'un cas
unknown
, le traitement de telles situations est devenu beaucoup plus facile.
Gestionnaire de paquets Swift
DĂ©sormais, les packages peuvent choisir la version minimale requise pour la plate-forme Apple (macOS, iOS) lors de l'utilisation du fichier de configuration Package.swift de Swift 5. L'assemblage de packages n'est pas possible si au moins l'une des dĂ©pendances a une version minimale de la plateforme supĂ©rieure Ă la version spĂ©cifiĂ©e pour le package lui-mĂȘme. ( SE-0236 )
Ă mon avis, c'est la nouvelle la plus importante concernant SPM. En fait, cette fonctionnalitĂ© peut rĂ©soudre de nombreux problĂšmes qui empĂȘchent SPM de devenir utile dans le monde iOS. Dans mon
dernier article, j'ai essayé d'analyser l'état actuel de SPM dans le contexte du développement iOS. Il me semble que maintenant je dois revoir les conclusions tirées.
Mais il y a des problĂšmes:
- certains projets montrent une régression du temps de compilation par rapport aux versions précédentes;
- projets pour le crash de la ligne de commande au démarrage,
dyld: Library not loaded
erreur dyld: Library not loaded
(bibliothÚque non chargée). Béquille: SWIFT_FORCE_STATIC_LINK_STDLIB=YES
construction de l'assemblage personnalisé SWIFT_FORCE_STATIC_LINK_STDLIB=YES
.
Le
journal des modifications rĂ©pertorie un certain nombre de bogues corrigĂ©s et d'autres informations sur Swift 5 qui peuvent ĂȘtre importantes pour votre secteur. VĂ©rifiez-les: vous pourriez dĂ©cider d'utiliser des initialiseurs dĂ©signĂ©s hĂ©ritĂ©s avec un nombre variable d'arguments. Ou peut-ĂȘtre que vous ĂȘtes confrontĂ© Ă un problĂšme de blocage dĂ» Ă des dĂ©finitions de types rĂ©cursives complexes avec des classes et des gĂ©nĂ©riques. Ou des alias gĂ©nĂ©riques dans la mĂ©thode
@objc
vous
@objc
.
Xcode 10.2 beta
Compilateur Clang
Il existe de nombreuses nouvelles alertes pour le compilateur Clang, et la plupart d'entre elles concernent les frameworks et les modules. Ce fait est assez intéressant car il parle (
vraisemblablement ) de l'intégration de Swift Package Manager en tant qu'outil de gestion des dépendances. Voici, à mon avis, les points les plus importants:
- de nouveaux diagnostics identifient les en-tĂȘtes de framework qui utilisent des guillemets au lieu des inclusions de style de framework. Par dĂ©faut, la notification est dĂ©sactivĂ©e, mais vous pouvez l'activer en passant l'option
-Wquoted-include-in-framework-header
;
- les en-tĂȘtes ouverts du framework peuvent exĂ©cuter par erreur
#import
ou #include
les en-tĂȘtes fermĂ©s, ce qui entraĂźne des perturbations structurelles et parfois une importation cyclique des modules. Ces violations seront signalĂ©es par un nouveau diagnostic. Il est dĂ©sactivĂ© par dĂ©faut dans clang
et est contrÎlé par l' -Wframework-include-private-from-public
;
- l'utilisation de
@import
dans les en-tĂȘtes du framework @import
leur utilisation sans modules. De nouveaux diagnostics recherchent @import
dans les en-tĂȘtes lors du passage de l'indicateur âfmodules
. Par défaut, il est désactivé et contrÎlé par l' -Watimport-in-framework-header
;
- Plus tÎt, la perte du mot-clé
framework
lors de la déclaration d'un module pour le framework n'a pas interféré avec la compilation, mais a conduit silencieusement au mauvais résultat. Nouveau diagnostic -Wincomplete-framework-module-declaration
et un nouveau correctif vous proposera d'ajouter la clé souhaitée. Cet avertissement est déclenché automatiquement lorsque clang
âfmodules
drapeau âfmodules
.
Tout d'abord: comment les allumer? Accédez au menu
ParamÚtres de construction de votre projet, sélectionnez l'élément
Apple Clang - Indicateurs de compilateur personnalisés et définissez l'indicateur souhaité sous
Autres indicateurs
C.
J'ai essayĂ© de construire une ancienne application Objective-C et j'ai trouvĂ© beaucoup de problĂšmes avec les en-tĂȘtes privĂ©s dans les en-tĂȘtes ouverts du framework:

Il y avait également des problÚmes avec les guillemets pour l'importation dans le cadre:

Je vous conseille de faire un diagnostic similaire, ou au moins de prendre une note pour l'avenir. Une fois que ces problĂšmes peuvent causer beaucoup de problĂšmes.
SystĂšme de construction
Il y a aussi une belle mise Ă jour du systĂšme de construction de code.
La recherche de dĂ©pendances implicites fonctionne dĂ©sormais dans la section «autres indicateurs de l'Ă©diteur de liens» des frameworks et bibliothĂšques associĂ©s marquĂ©s avec -framework, -weak_framework, -reexport_framework, -lazy_framework, -weak-l, -reexport-l, -lazy-l âl.
Cette innovation est également trÚs intrigante. En substance, cela signifie que vous pouvez maintenant définir des dépendances implicites à l'aide de l'
.xcconfig
ou mĂȘme
xcodebuild
, en Ă©vitant les Ă©tapes Link / Embed dans Xcode lui-mĂȘme.
Débogage
Innovations du débogueur:
UIStackView
propriétés UIStackView
désormais affichées dans l'inspecteur du débogueur visuel. Le débogueur visuel a obtenu un aspect tridimensionnel plus compact.

DĂ©sormais, en cas d'erreur due Ă un manque de mĂ©moire, Xcode peut automatiquement crĂ©er un graphique d'utilisation de la mĂ©moire. Vous pouvez activer la crĂ©ation de graphiques dans la fenĂȘtre de diagnostic dans les paramĂštres d'exĂ©cution du schĂ©ma.
Lorsque vous approchez de la limite d'utilisation de la mémoire dans iOS et watchOS, Xcode affiche la limite dans le rapport d'utilisation de la mémoire.

Vous voyez la ligne rouge? Lorsqu'il est atteint, Watchdog recevra une notification d'
applicationDidReceiveMemoryWarning
. Je pensais que la mise Ă jour serait plus utile, mais pour l'instant ce n'est qu'un petit plus.
Débogueur LLDB
De nouveaux petits pains sont apparus dans LLDB:
- Vous pouvez maintenant utiliser $ 0, $ 1 et d'autres abréviations lors de l'évaluation des expressions à l'intérieur des fermetures.
- LLDB a maintenant un nouvel alias
v
pour la commande de variable de cadre, qui est utilisé pour afficher les variables dans la pile de cadres actuelle. Comme cela n'implique pas l'outil d'évaluation des expressions, v
peut ĂȘtre beaucoup plus rapide que p
ou po
, et donc c'est préférable.
Je n'ai pas trouvé d'amélioration des performances, mais dans certains cas,
v
offre une meilleure sortie - mais ce n'est pas un remplacement direct pour
po
et ne fonctionne qu'avec la pile de trames actuelle avec certaines limitations. Exemples:

Terrains de jeux
Ma section préférée! Commençons par les bugs:
L'application Playgrounds peut ne pas démarrer
Malheureusement, il n'y avait aucune autre nouvelle concernant Playgrounds dans la nouvelle version bĂȘta.
Simulateur
Quelques mots sur le simulateur:
Siri ne fonctionne pas dans les simulateurs watchOS et iOS.
La synchronisation de la table de montage entre macOS et les appareils iOS simulés est devenue plus fiable.
J'espĂšre que c'est vrai.
La demande d'accÚs au microphone sur tous les appareils simulés ne sera pas répétée.
C'est une bonne nouvelle car beaucoup de gens ont eu des problÚmes avec CI et ont construit des agents à cause de ce problÚme. Vous pouvez maintenant construire une béquille, ou au moins compléter vos guides sur le travail avec les agents d'assemblage en incluant l'option "Exécuter le simulateur une fois".
Test
xccov
prend en charge la combinaison de plusieurs rapports de couverture de code (et archives associées) en un seul rapport et archive communs. Le rapport résultant peut contenir des inexactitudes, car entre les moments de création de rapports, des modifications peuvent se produire dans les fichiers source. Si aucun changement ne s'est produit, le rapport sera correct.
xccov
reflĂšte dĂ©sormais la diffĂ©rence entre les diffĂ©rents rapports de couverture Xcode, qui peuvent ĂȘtre utilisĂ©s pour calculer les changements de couverture. Par exemple, pour mettre en Ă©vidence la diffĂ©rence entre before.xccovreport
et after.xccovreport
, appelez la commande xccov
comme suit: xccov diff --json before.xccovreport after.xccovreport
.
- les cibles de bibliothĂšque et de framework statiques apparaissent dĂ©sormais dans le rapport de couverture sous la forme d'entrĂ©es de niveau supĂ©rieur - des graphiques d'indicateurs de couverture sont collectĂ©s pour toutes les cibles qui incluent une bibliothĂšque ou un framework statique. Cela rĂ©sout Ă©galement le problĂšme lorsque les fichiers source d'une bibliothĂšque statique ou d'une cible de structure sont entrĂ©s dans le rapport, mĂȘme si la cible elle-mĂȘme est supprimĂ©e de la couverture de code dans le diagramme.
Excellente nouvelle pour une intégration continue, en particulier une démonstration de la différence. Informez vos ingénieurs de publication ou ceux qui font des choses similaires.
Cependant, il existe plusieurs limitations concernant la parallélisation des tests:
- l'enregistrement sur des clones ne fonctionne pas lorsque la parallélisation est activée;
- le profilage de projet à partir de Xcode se comporte incorrectement avec la parallélisation de test activée.
Le reste est satisfait de la correction de quelques bugs:
Si le test échoue en raison de la panne du lanceur de test au démarrage, Xcode essaiera de générer un message détaillé décrivant l'erreur. Vous pouvez examiner cette erreur dans le journal de test et si vous utilisez xcodebuild
, elle apparaßtra également dans stdout
. Il est également contenu dans les journaux structurés du package résultant.
Nous avons souvent des problÚmes similaires - et nous ne savons pas ce qui s'est passé. Parfois, le problÚme est la mauvaise disposition, parfois la surcharge du systÚme. Maintenant, la fiabilité de l'application augmentera.
Dans les rapports d'erreur collectés lors des tests, les sections importantes telles que la raison de l'accident ou la description ne sont plus perdues.
Aucun commentaire ici, pur délice.
DerniÚres nouvelles utiles à de nombreux développeurs: Xcode prend désormais en charge le
service de mise en cache de contenu macOS . Cela signifie qu'avec vous, vous pouvez créer un serveur de mise en cache sur le réseau local, ce qui vous fera gagner du temps et de l'argent lors du téléchargement de nouvelles et anciennes versions de Xcode sur le réseau local.
Les problĂšmes
Dans cette version bĂȘta, j'ai rencontrĂ© plusieurs problĂšmes. Ils concernaient principalement les outils de dĂ©veloppeurs tiers. Par exemple,
carthage
génÚre l'erreur "Aucun simulateur disponible pour iOS n'a été trouvé."
J'ai vĂ©rifiĂ© le simulateur disponible et il semble que le bĂȘta soit Ă blĂąmer. De plus, le tĂ©lĂ©chargement d'autres runtimes depuis Xcode n'est pas disponible - la liste des simulateurs disponibles est vide:
$ xcrun simctl list devices --json | grep -A16 12.1 "com.apple.CoreSimulator.SimRuntime.iOS-12-1" : [ { "availability" : "(unavailable, runtime profile not found)", "state" : "Shutdown", "isAvailable" : false, "name" : "iPhone 5s", "udid" : "DDD36346-A76F-42E8-80F4-6F11E1EE4BEB", "availabilityError" : "runtime profile not found" }, { "availability" : "(unavailable, runtime profile not found)", "state" : "Shutdown", "isAvailable" : false, "name" : "iPhone 6", "udid" : "21794717-BC89-45E4-9F57-8CF9D14A87D1", "availabilityError" : "runtime profile not found" }, --
Mais ce n'est qu'une version bĂȘta, et la liste des changements est Ă©norme. Nous serons patients. Carthage Ă©tudie dĂ©jĂ la situation, toutes les suppositions sont dĂ©crites dans ce
bug .
iOS 12.2 bĂȘta
Tellement. Il semble qu'Apple soit en train de polir la dette technique et d'appliquer des correctifs de sécurité, donc pas de nouvelles sérieuses, mais il y a deux problÚmes:
- il est possible que vous ne puissiez pas vous authentifier avec Wallet aprĂšs avoir choisi une carte;
- il est possible que vous ne puissiez pas acheter un plan tarifaire prépayé en utilisant le réseau mobile.
Et Apple News est maintenant disponible au Canada.
Ne changez pas.
macOS Mojave 10.14.4 beta
La seule mise Ă jour ici est un problĂšme possible avec Safari 12.1 aprĂšs la mise Ă niveau de Safari 10.1.2.
AprĂšs la mise Ă niveau vers Safari 12.1 Ă partir de Safari 10.1.2, les pages Web peuvent ne pas s'afficher correctement. (47335741)
Solution de contournement:
defaults delete com.apple.Safari
par
defaults delete com.apple.Safari
dans le terminal. Veuillez noter qu'avec cela, vous perdrez tous les paramÚtres Safari précédents.
En conclusion
L'article est sorti beaucoup plus gros que ce à quoi je m'attendais. Vous trouverez toutes mes découvertes ci-dessus. Et en bref - Swift 5 est venu!
Merci de votre attention.