Xcode 10.2, macOS Mojave 10.14.4, iOS 12.1 et autres bêtas



De nouveaux bêtas sont là et ce sont quelques-unes des choses les plus importantes que j'ai apprises à leur sujet.

Swift 5 pour Xcode 10.2 beta


Rapide


Premièrement, la dernière version bêta de Xcode est livrée avec la version Swift suivante:

Apple Swift version 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 les bibliothèques liées dynamiquement pour la bibliothèque standard Swift et les superpositions SDK Swift dans les variantes de build pour les appareils exécutant iOS 12.2, watchOS 5.2 et tvOS 12.2. Par conséquent, les applications Swift peuvent être plus petites lorsqu'elles sont déployées pour les tests à l'aide de TestFlight, ou lors de l'amincissement d'une archive d'applications pour la distribution de développement local.
La stabilité de l'interface binaire de l'application arrive! Et c'est une excellente nouvelle. Je pense que c'est l'un des problèmes les plus importants à l'heure actuelle avec Swift. Pas à cause des effets secondaires mais à cause de l'échec de Swift à tenir ses promesses précédentes. Quoi qu'il en soit, je connais même des gens qui réécrivent leurs extensions Apple Watch en Objective C pour réduire la taille du binaire (quelque chose comme 15 Mo contre ~ 1 Mo en Objective C). Si vous souhaitez en savoir plus sur l'état d'ABI, suivez les liens: Swift - ABI Dashboard et Swift ABI Stability Manifesto .

L'attribut @dynamicCallable vous permet d'appeler des types nommés comme vous appelez des fonctions à l'aide d'un sucre syntaxique simple. Le principal cas d'utilisation est l'interopérabilité dynamique des langages. ( SE-0216 )

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]) 

C'est un sujet énorme et j'ai des sentiments mitigés sur la fonctionnalité. Alors, lisez le post "Quoi de neuf dans Swift 5.0" de Paul Hudson si vous voulez en savoir plus sur ce qui s'en vient.
Le mode Swift 3 a été supprimé. Les valeurs prises en charge pour l' -swift-version sont 4, 4.2 et 5.
Le moment est venu. La compatibilité des sources avec Swift 3 n'est plus. Il était attendu et annoncé avec Swift 5 Roadmap, mais toujours. Je vous recommande vivement de rafraîchir votre mémoire avec "Swift 5.0 Release Process" car Swift 5 est presque là. Préparez-vous.
En mode Swift 5, les commutations sur les énumérations déclarées dans Objective-C ou provenant de frameworks système sont nécessaires pour gérer les cas inconnus - des cas qui pourraient être ajoutés à l'avenir ou qui pourraient être définis en privé dans un fichier d'implémentation d'Objective-C . Formellement, Objective-C permet de stocker n'importe quelle valeur dans une énumération à condition qu'elle tienne dans le type sous-jacent.
Ces cas inconnus peuvent être traités à l'aide du nouveau cas @unknown default , qui fournit toujours des avertissements si des cas connus sont omis du commutateur. Ils peuvent également être traités à l'aide d'un cas default normal.

Si vous avez défini votre propre énumération dans Objective-C et que vous n'avez pas besoin de clients pour gérer les cas inconnus, vous pouvez utiliser la macro NS_CLOSED_ENUM au lieu de NS_ENUM . Le compilateur Swift reconnaît cela et ne nécessite pas de commutateurs pour avoir un cas par défaut.

Dans les modes Swift 4 et 4.2, vous pouvez toujours utiliser @unknown default . Si vous l'omettez et qu'une valeur inconnue est transmise au commutateur, le programme s'interrompt à l'exécution, comme Swift 4.2 dans Xcode 10.1. ( SE-0192 )
Cela a été et est toujours un problème, surtout si vous n'utilisez pas d' approche par défaut dans les commutateurs. Je me souviens des contournements moches de la nouvelle option UNAuthorizationOptions propriété UNAuthorizationOptions qui a été introduite dans iOS 12. Maintenant, avec un cas inconnu, il est beaucoup plus facile de gérer de tels scénarios.

Gestionnaire de paquets Swift


Les packages peuvent désormais personnaliser le paramètre cible de déploiement minimum pour les plates-formes Apple lors de l'utilisation de la version des outils Swift 5 Package.swift. La génération d'un package émet une erreur si l'une des dépendances de package du package spécifie une cible de déploiement minimum supérieure à la cible de déploiement minimale du package. ( SE-0236 )
La nouvelle la plus importante pour moi concerne Swift Package Manager. Techniquement, ce changement peut résoudre de nombreux problèmes qui empêchent SPM d'être utile dans le monde iOS. Dans mon article précédent " Swift Package Manager construit des frameworks iOS ", j'ai essayé d'analyser l'état actuel de SPM dans le contexte du développement iOS. Et maintenant, il semble que je vais devoir réévaluer mes pensées et mes conclusions.

Il y a aussi de mauvais problèmes:
Certains projets peuvent subir des régressions de temps de compilation à partir des versions précédentes;
Les projets de ligne de commande Swift se bloquent au lancement avec des erreurs "dyld: Library not Charger".
Solution: ajoutez un paramètre de génération défini par l'utilisateur

 SWIFT_FORCE_STATIC_LINK_STDLIB=YES 


De nombreux problèmes ont été résolus ainsi que d'autres points du journal des modifications liés à Swift 5, mais ils sont spécifiques à ce que vous faites. Vérifiez-les, vous souhaitez peut-être utiliser des initialiseurs désignés hérités avec des paramètres variadiques, ou vous avez été bloqué par le problème de blocage en raison de définitions de types récursifs complexes impliquant des classes et des génériques, ou vous rencontrez des problèmes avec l'alias de type générique dans une méthode @objc .

Xcode 10.2 beta


Compilateur Apple Clang


Il y a beaucoup de nouveaux avertissements pour le compilateur Apple Clang. Et la plupart d'entre eux sont liés aux frameworks et modules. C'est assez intéressant car il peut être associé à l'intégration de Swift Package Manager en tant qu'outil de dépendance. Les plus importants, à mon avis, sont:
Un nouveau diagnostic identifie les en-têtes de framework qui utilisent les inclusions quote plutôt que les styles de framework. L'avertissement est désactivé par défaut, mais vous pouvez l'activer en passant -Wquoted-include-in-framework-header à clang;
Les en-têtes publics dans un cadre peuvent par erreur #import ou #include
en-têtes privés, ce qui provoque des violations de superposition et des cycles de modules potentiels. Il y a un nouveau diagnostic qui signale de telles violations. 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 empêche les en-têtes d'être utilisés sans modules. Un nouveau diagnostic détecte l'utilisation de @import dans les en-têtes de framework lorsque vous passez l'indicateur fmodules . Le diagnostic est désactivé par défaut dans clang et est contrôlé à l'aide de l' Watimport-in-framework-header - Watimport-in-framework-header ;
Auparavant, l'omission du mot clé framework lors de la déclaration d'un module pour un framework n'affectait pas la compilation, mais cela faisait silencieusement la mauvaise chose. Un nouveau diagnostic, - Wincomplete-framework-module-declaration , et un nouveau correctif suggèrent d'ajouter le mot-clé approprié. Cet avertissement est -fmodules par défaut lorsque vous passez l'indicateur -fmodules à clang.
Tout d'abord, comment les activer: allez aux paramètres de construction pour votre cible d'application, recherchez «Apple Clang - Indicateurs de compilateur personnalisés» et placez l'indicateur souhaité sur «Autres indicateurs .



J'ai essayé de construire une ancienne application basée sur Objective C et j'ai trouvé beaucoup de problèmes avec les en-têtes privés dans les en-têtes du cadre public:



Et quelques problèmes avec les importations à double cotation dans les cadres:



Je vous recommande également d'exécuter de tels diagnostics et, au moins, de créer des problèmes pour votre backlog. Un jour, tous ces problèmes vous causeront un vrai mal de tête.

Système de construction


Il y a aussi une nouvelle fonctionnalité intéressante de Build System:
Les dépendances implicites prennent désormais en charge la recherche de dépendances dans d'autres -framework de -framework pour les -framework et bibliothèques liées spécifiées avec -framework , -weak_framework , -reexport_framework , -lazy_framework , -weak-l, -reexport-l , -lazy-l et -l .
C'est aussi très intéressant. En général, cela signifie que vous pouvez définir vos dépendances implicites via .xcconfig ou même avec les options xcodebuild et éviter ces liens /
Incorporez des phases dans Xcode.

Débogage


Le débogage a de nouvelles fonctionnalités:
Les propriétés UIStackView sont maintenant présentées dans l'inspecteur d'objets du débogueur de vue;
Le débogueur de vue présente une disposition 3D plus compacte.


Xcode peut désormais capturer automatiquement un graphique de mémoire, si une exception de ressource mémoire est rencontrée lors du débogage. Pour activer les captures de graphique de mémoire, accédez à l'onglet Diagnostics des paramètres d'exécution du schéma;
Sur iOS et watchOS, Xcode affiche la limite de mémoire pour exécuter des applications dans le rapport de mémoire lorsque vous approchez de la limite;


Vous voyez la ligne rouge? Watchdog envoie applicationDidReceiveMemoryWarning(...)
lorsque vous atteignez le bord. Mais je pensais que ce serait plus utile qu'il ne l'est, pour être honnête. Pour l'instant, cela ressemble à une amélioration mineure et agréable.

Débogueur LLDB


Et le débogueur LLDB a également eu de l'amour:

Vous pouvez désormais utiliser des raccourcis $0, $1, ... dans l'évaluation des expressions LLDB à l'intérieur des fermetures;
Le débogueur LLDB a un nouvel alias de commande, v , pour la commande "variable de cadre" pour imprimer les variables dans le cadre de pile actuel. Parce qu'il contourne l'évaluateur d'expression, v peut être beaucoup plus rapide et doit être préféré à p ou po .
Je n'ai remarqué aucune amélioration des performances, mais v produit une meilleure sortie dans certains cas, bien qu'il ne remplace pas po en général, c'est uniquement pour le cadre de pile actuel avec certaines limitations. Voir les exemples ci-dessous.



Terrains de jeux


Ma section préférée? Terrains de jeux! Commençons par les problèmes connus:
Les aires de jeux pourraient ne pas s'exécuter!
Malheureusement, c'est la seule nouvelle concernant Playgrounds dans la version bêta actuelle.

Simulateur


Quelques notes sur Simulator:
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 plus fiable;
J'espère vraiment que ça l'est.
Vous n'êtes maintenant invité qu'une seule fois à autoriser l'accès au microphone à tous les appareils du simulateur.
Il s'agit d'une belle amélioration car de nombreuses personnes rencontrent des problèmes avec CI et génèrent des agents à cause de ce problème. Désormais, une solution de contournement peut être automatisée ou, au moins, nous pouvons mettre à jour nos guides pour configurer les agents de build avec l'étape "Exécuter un simulateur une fois".

Test


xccov prend en charge la fusion de plusieurs rapports de couverture - et de leurs archives associées - dans un rapport et des archives agrégés. Lors de la fusion de rapports, le rapport agrégé peut être inexact pour les fichiers source qui ont changé depuis la génération des rapports d'origine. S'il n'y a eu aucun changement de source, le rapport agrégé et l'archive seront exacts;
xccov prend désormais en charge différents rapports de couverture Xcode, qui peuvent être utilisés pour calculer les changements de couverture au fil du temps. Par exemple, pour différencier les rapports de couverture before.xccovreport et after.xccovreport , 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 en tant qu'entrées de niveau supérieur, avec des valeurs de couverture de ligne qui sont agrégées sur toutes les cibles qui incluent la bibliothèque ou le framework statique. Cela résout également un problème dans lequel les fichiers source d'une bibliothèque statique ou d'une cible de structure seraient inclus dans le rapport de couverture même si la cible elle-même était exclue de la couverture de code dans le schéma.
Ces changements sont d'excellentes nouvelles pour l'intégration continue. Particulièrement différent. Informez votre équipe d'ingénierie des versions et toute autre personne responsable de ces choses.

Cependant, il existe certaines limitations liées au test de la parallélisation:
L'enregistrement ne fonctionne pas à partir de clones lorsque la parallélisation est activée;
Les tests de profilage ne se comportent pas correctement lorsque la parallélisation des tests est activée;
Il existe également des corrections de bugs prometteuses:
Si le test échoue en raison de l'échec du lanceur de test au lancement, Xcode tente de générer un message d'erreur riche décrivant l'échec. Cet échec est présent dans le journal d'activité de test et apparaît dans stdout si vous utilisez xcodebuild . L'erreur est également présente dans les journaux structurés contenus dans l'ensemble de résultats.
Nous rencontrons beaucoup de ces problèmes, et généralement, ce n'est pas clair du tout ce qui se passe. Parfois, cela est lié à une liaison incorrecte, parfois à une surcharge du système. Cela devrait aider à réduire la desquamation.
Les rapports de plantage collectés lors des tests n'omettent plus de champs importants tels que la raison et la description de l'arrêt.
Pas de commentaire juste l'amour.


Et le dernier point sur Xcode, utile pour les entreprises avec beaucoup de développeurs, Xcode prend désormais en charge le service de mise en cache de contenu macOS . Cela signifie que vous pouvez avoir un serveur de mise en cache avec l'application Xcode dans votre réseau local.

Problèmes


J'ai rencontré quelques problèmes avec la bêta. Surtout avec des outils tiers: Carthage, par exemple, qui ne fonctionne pas, avec l'erreur suivante:

 Could not find any available simulators for iOS 

J'ai vérifié le simulateur disponible et il semble que quelque chose soit cassé dans la version bêta actuelle; il est également impossible de télécharger d'autres runtimes depuis Xcode, la liste des simulateurs disponibles est juste vide (un radar rempli):

 $ 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" }, -- 

C'est une version bêta, bien sûr. Et le changelog est énorme. Soyez patient et raisonnable :)

PS Carthage a déjà un correctif ( # 2691 ).

iOS 12.2 bêta


Ok Il semble qu'ils polissent leur dette technologique et appliquent des correctifs de sécurité. Deux choses sont cassées:
Vous ne pourrez peut-être pas vous authentifier dans Wallet après avoir sélectionné une carte;

Vous ne pourrez peut-être pas acheter un forfait de données prépayé à l'aide de données cellulaires.
Et Apple News sera disponible au Canada . Restez à l'écoute.

macOS Mojave 10.14.4 beta


La seule nouveauté ici est un problème potentiel avec Safari 12.1. Après la mise à niveau de Safari 10.1.2:
Après la mise à jour vers Safari 12.1 depuis Safari 10.1.2, les pages Web peuvent ne pas s'afficher.
Solution: exécutez la commande suivante dans le terminal:

 defaults delete com.apple.Safari 
Avec les conséquences suivantes:
Avertissement: vous perdrez vos paramètres Safari précédents après avoir exécuté la commande ci-dessus.

Coupe finale


Cet article s'est avéré être beaucoup plus long que je ne le pensais. Eh bien, je vous ai donné toutes mes pensées sur toutes les sections ci-dessus. Une version courte de l'article entier est simplement: «Swift 5 est arrivé!

Restez à l'écoute et hydraté! Et merci d'avoir lu.

Source: https://habr.com/ru/post/fr437812/


All Articles