Un guide étape par étape pour convertir une application Objective-C complète en Swift
Publié: 2018-03-14Depuis sa sortie en 2014, le langage de programmation Swift d'Apple a connu une croissance phénoménale. Le langage de programmation a réussi à se faire une place dans la corvée du Top 10 des langages de programmation , partageant la position avec son prédécesseur, Objective-C. Mais la guerre entre Swift et Objective-C ne s'adoucit jamais.
Avec cette popularité croissante et ces fonctionnalités intéressantes, de nombreux développeurs d'applications iOS qui travaillaient auparavant avec Obj-C sont passés au langage de programmation Swift. En fait, dans le cadre de la lutte contre Swift ou Objective-C pour iOS, diverses applications iOS telles que LinkedIn, Yahoo Weather, Hipmunk et Lyft ont déjà été mises à niveau d'Objective-C vers Swift, tandis que beaucoup envisagent de convertir une application Objective-C. à Swift.
FACTEURS FAISANT DE SWIFT UNE MEILLEURE OPTION
Personnellement, j'ai vu l'évolution de Swift depuis que sa première version a été dévoilée et je peux dire qu'entre Swift vs C, Swift remplace Objective-C en fonction de facteurs, comme
Open source
Swift est un langage open-source et le code Swift peut être portable sur beaucoup plus de plates-formes qu'Objective-C ne l'a jamais été.
Vitesse
Le développement Swift pour iOS est un langage de type statique qui fonctionne avec le compilateur LLVM et peut réutiliser le code existant, supprimer les ressources inutilisées, gérer les fonctions en ligne, etc. En outre, son fonctionnement est basé sur l'une des arithmétiques de calcul d'algorithmes les plus rapides de C++, ce qui prouve à son tour qu'il a un avantage concurrentiel sur son prédécesseur.
Selon ce qu'Apple prétend et j'ai vécu, l'algorithme de recherche Swift est 2,6 fois plus rapide que Objective-C.
Lisibilité
Contrairement à Objective-C, Swift n'est pas lié aux fondations C. Il permet aux développeurs iOS de supprimer les appels de méthode imbriqués, de sauter un point-virgule à la fin d'une ligne, d'éviter de mettre @ au début d'un mot-clé, de concaténer une chaîne à l'aide du signe "+", etc. De plus, la classe Swift n'est pas divisée en parties, l'interface et l'implémentation. Cela a réduit la longueur du code à près de moitié, ce qui le rend plus lisible.
Par exemple, lorsque l'application Lyft a été entièrement réécrite en langage Swift, le code de l'application est passé de 75 000 à 25 000 lignes. Ces chiffres impressionnants réduisent les efforts des développeurs sans affecter les performances de l'application côté client.
Codage interactif
Avec sa fonctionnalité Playgrounds, il permet aux programmeurs d'écrire un morceau de code ou d'algorithme tout en recueillant des commentaires tout au long de la phase de développement. Comme le code Swift est écrit à l'aide de visualisations de données, cela rend le processus de développement d'applications plus facile et accessible.
Sécurité
Swift est un langage plus sûr et plus sécurisé pour créer une application selon les tendances actuelles du marché. Sa syntaxe et sa construction linguistique ont exclu les types d'erreurs couramment observées lors du codage en langage Objective-C. Cela implique qu'il y a moins de risques de plantage de l'application et de cas de comportement problématique.
Contrairement à cela dans le cas d'Objective-C, le code écrit en Swift peut être compilé et les erreurs peuvent être corrigées, ainsi que la partie écriture de code. Par conséquent, Swift agit mieux et plus rapidement dans le processus de test, par rapport au processus de test du code Objective-C.
Maintenance
Étant donné que Swift ne dépend pas de C comme son prédécesseur, la maintenance en cas de développement d'applications Swift est beaucoup plus facile. Quelque chose qui a fait de Swift l'avenir du développement d'applications iOS .
En cas de création d'une application iOS à l'aide d'Objective-C, les développeurs étaient censés conserver deux fichiers de code distincts pour augmenter le temps de création et l'efficacité du code. Cependant, Swift a abandonné ce mécanisme à deux fichiers, fusionnant l'en-tête Objective-C (.h) et les fichiers d'implémentation (.m) en un seul fichier (.swift). Le compilateur LLVM découvre automatiquement les dépendances lors de la lecture du fichier Swift, ce qui est un grand avantage pour les développeurs d'applications iOS.
Outre les facteurs mentionnés ci-dessus, l'avantage notable de choisir Swift par rapport aux autres langages de programmation d'Apple est sa compatibilité avec Objective-C. Apple a offert aux développeurs d'applications la possibilité d'utiliser les deux langues dans le même projet. Ce n'est pas seulement utile en cas de développement d'une application iOS en utilisant Swift à partir de zéro, mais également pour mettre à niveau leur application existante vers Swift en utilisant le code Objective-C.
Bien que vous soyez maintenant familiarisé avec les différences philosophiques entre les deux langages de développement d'applications iOS, passons aux différences lors de la mise en œuvre pratique.
SWIFT VS OBJECTIVE-C : DIFFÉRENCES MAJEURES ENTRE LES TITANS DU DÉVELOPPEMENT IOS
Grâce à mon expérience avec la base de code Objective-C complexe et la base de code Swift, vous rencontrerez plusieurs mises à niveau des concepts existants ainsi qu'une introduction à divers nouveaux éléments rendant le processus de développement d'applications rapide. Sans faire de bruit, jetons un coup d'œil à tout ce que vous trouverez de nouveau/différent dans la guerre de Swift vs Objective c.
Options
Lorsque nous parlons de performances Swift vs Objective-C, nous pouvons appeler des méthodes sur des objets nil pour obtenir une valeur nulle dans Obj-C. Nous devons effectuer manuellement des vérifications nulles pour comprendre le comportement indéfini en cas de valeur nulle inattendue. Cependant, ce problème peut être résolu en utilisant Optional, un nouveau concept introduit dans le code Swift. Optional permet aux fonctions qui pourraient ne pas être en mesure de renvoyer une valeur significative de renvoyer une valeur encapsulée dans un optionnel ou nil.
La syntaxe de déclaration de type facultatif est :
Énumération publique Facultatif<Enveloppé> : _Reflectable, NilLiteralConvertible
En pratique, il peut avoir soit une valeur de type Enveloppé, soit une valeur inexistante.
Swift rend le sucre syntaxique pour déclarer les types facultatif, nous pouvons donc remplacer le Optional<String> par String ?
Il existe principalement deux façons d'obtenir une valeur encapsulée à partir du conteneur facultatif :
Enchaînement facultatif : utilisé dans le cas où l'instruction conditionnelle if-let recevra une valeur uniquement si elle existe.
Emballage forcé : utilisé lorsque la variable facultative déclarée est non nulle. Si la valeur existe, elle fournira la sortie sans conditions d'implémentation. Mais, dans l'autre cas, il plantera.
Nous pouvons également trouver des options implicitement déballées dans le langage Swift, déclarées comme String !
Par example:
Classe XClass
{
var aString : chaîne
var bString : Chaîne !
var cString : chaîne ?
Init (chaîne : chaîne)
{
uneChaîne = chaîne
}
}
Ici,
Une chaîne ne peut jamais être nulle. Il est crucial que cette variable ait une valeur lors de l'initialisation de l'objet, sinon le programme conduira à un plantage.
La chaîne B peut être nulle. Cependant, si vous essayez d'accéder à l'objet nil, le programme plantera.
C String peut être nil et est censé être traité comme une variable optionnelle régulière.
Rallonges
Les extensions et catégories présentes dans Obj-C sont regroupées en une seule entité, les extensions en langage Swift. Les extensions ajoutent de nouvelles fonctionnalités à une classe, une énumération, une structure ou un protocole déjà existant, et la meilleure partie est que vous n'avez pas besoin d'avoir accès au code source d'origine pour étendre les types.
Tuples
Outre les options, un autre nouveau type de données introduit dans le nouveau langage de développement d'Apple est Tuples. Les tuples (à la place du type de données défini par l'utilisateur) sont essentiellement considérés comme regroupant de nombreuses valeurs dans un seul groupe composé. C'est le bon élément à considérer si vous pensez que la création d'un modèle à un endroit peut être exagérée et que le dictionnaire n'est pas assez convivial pour le lecteur. Pour en savoir plus sur les tuples, consultez ce blog .
Génériques
Les génériques sont l'une des caractéristiques les plus frappantes du langage de programmation Swift et, en fait, la plupart des bibliothèques standard Swift sont créées avec du code Swift. Le code générique permet aux développeurs d'écrire des fonctions et des types flexibles et réutilisables qui peuvent fonctionner avec différents ensembles de types, sous réserve des exigences définies. Cela minimise le risque de duplication et améliore la lisibilité du code avec une approche claire et abstraite.
Selon mon expérience, les génériques sont difficiles à obtenir au début, tout comme les récursions. Mais, lorsque vous mettrez la main dessus, vous pourrez dérouler un tout nouveau monde de résolution de problèmes logiques fastidieux.
Énumération
Dans le code Objective-C, les énumérations sont limitées aux types primitifs. Pour mapper les valeurs d'énumération d'entiers à celles des chaînes pour afficher la sortie, vous devez introduire un tableau ou vous tourner vers la structure de contrôle du commutateur. Cependant, vous n'avez pas besoin de passer par ces tracas avec le langage de développement d'applications Swift iOS.
Swift propose de nouvelles énumérations variées avec plus d'options. Les énumérations Swift peuvent avoir des valeurs associées et le cas d'énumération Swift peut contenir un ensemble prédéfini de champs. En fait, les énumérations Swift peuvent être récursives et stocker des valeurs brutes.
Par example:
Indices
Les indices peuvent être considérés comme un moyen d'accéder aux informations d'une séquence, d'une collection ou d'une liste dans des classes, des énumérations et des structures sans utiliser de méthode. Vous pouvez envisager des indices pour définir et récupérer des valeurs par index sans créer de méthodes distinctes pour le stockage et la récupération. Par exemple, vous pouvez accéder aux éléments d'une instance Array en tant que someArray[index] et aux éléments d'une instance Dictionary en tant que someDictionary[key].
La syntaxe pour déclarer un indice est la suivante :
indice (indice : Int) -> Int {
avoir {
//pour déclarer la valeur de l'indice
}
set (nouvelleValeur) {
//pour définir les valeurs
}
}
Inférence de type
Swift a également proposé la sécurité des types pour le développement d'applications iOS, selon laquelle une variable lorsqu'elle est déclarée avec un type particulier, son type sera statique et immuable. Le compilateur déterminera (ou déduira) le type de votre variable sur la base des valeurs que vous affectez.
Par example:
Ici, le compilateur affichera une erreur lorsque vous essayez d'initialiser avec des valeurs numériques à une variable str2 (voir ci-dessous)
Les fonctions
La syntaxe Function dans le langage de programmation Swift est plus flexible à définir que celle du style de code Objective-C complexe. Dans Swift, chaque fonction a un type qui comprend les types de paramètres et le type de retour de la fonction, ce qui implique que vous pouvez affecter des fonctions à une variable ou la transmettre comme valeur à d'autres fonctions (comme indiqué dans l'exemple ci-dessous) :
En dehors de cela, Swift a également laissé les développeurs d'applications définir les valeurs par défaut des paramètres fonctionnels.
La gestion des erreurs
Swift offre une approche entièrement nouvelle pour lancer, attraper, faire circuler et manipuler les erreurs récupérables au moment de l'exécution. Pour avoir un aperçu de la gestion des erreurs dans Swift, consultez le blog.
En dehors de ceux-ci, divers concepts qui font du développement d'applications Swift un gagnant-gagnant par rapport au développement d'applications Objective-C sont :
Des modèles
Dans le cas de Swift, il est préférable que les modèles soient des structures plutôt que des classes.
Protocoles
Dans la toute première des vidéos Apple WWDC, Swift a été présenté comme un "langage orienté protocole". Un protocole peut être défini comme un plan de méthodes, de propriétés et d'autres entités qui conviennent à une tâche/fonctionnalité particulière. Ils peuvent être inclus dans une classe, une énumération ou une structure pour faciliter une implémentation réelle de ces exigences, et sont beaucoup plus puissants par rapport à Obj C avec les fonctionnalités de fournir des implémentations par défaut, d'incorporer des génériques, etc.
En tant que développeur d'applications iOS, je préfère créer un protocole avant de définir une classe comme la pratique la plus efficace pour tirer parti des avantages du langage de programmation avancé d'Apple.
Approche de programmation fonctionnelle
Swift permet aux développeurs d'utiliser davantage d'approches fonctionnelles pour résoudre des problèmes banals que d'utiliser des boucles traditionnelles ou des types de références. Ici, la perspective est d'analyser un problème en termes de solution, au lieu de déterminer comment obtenir la solution comme le fait l'approche traditionnelle.
D'après mon expérience avec le langage iOS, une chose que j'ai remarquée est que ce que nous faisions par itérations en utilisant des boucles for dans Objective-C peut être fait en utilisant le concept de filtre, mapper et réduire dans Swift. Pour obtenir des informations détaillées sur ces fonctions d'ordre supérieur dans la programmation fonctionnelle, consultez le blog.
GUIDE ÉTAPE PAR ÉTAPE POUR CONVERTIR UNE APPLICATION OBJECTIVE-C COMPLÈTE EN SWIFT
Aujourd'hui, il existe divers outils pour convertir une application d'Objective-C en Swift ligne par ligne. Cependant, je déconseille d'en utiliser. Bien que les deux langages iOS soient interopérables, leurs paradigmes de programme sont différents. La migration directe d'une application d'Obj-C vers Swift entraînera un risque plus élevé d'utiliser les mauvais paradigmes. Permettez-moi de développer cela.
Swift, contrairement à son prédécesseur, est influencé par le paradigme de la programmation fonctionnelle, ce qui le rend fortement dépendant de l'immuabilité. Par exemple, si vous parlez de tableaux et de dictionnaires, ces modèles de base sont utilisés comme type de référence dans Objective-C, mais ils sont de type valeur dans Swift, donc immuables. Cela implique que la conversion du code Obj-C en Swift à l'aide de n'importe quel outil vous fera faire face à de nombreuses erreurs difficiles à déboguer. En outre, Swift a des tonnes de nouvelles fonctionnalités (comme déjà décrit ci-dessus) qui rendent les algorithmes/approches plus efficaces et les programmes plus rapides ! En fait, c'est la principale raison pour laquelle Apple a dévoilé un nouveau langage plutôt que de mettre à niveau Obj-C. Avec tous ces points en considération, je recommande fortement à tous d'écrire une nouvelle application dans Swift à partir de zéro plutôt que d'opter pour une conversion ligne par ligne d'Obj-C vers Swift.
Néanmoins, si vous souhaitez convertir une application Objective-C complète en Swift, un outil que vous pouvez utiliser est Swiftify. L'outil facilite le processus de mise à niveau du code Obj-C vers le nouveau langage de programmation d'Apple en un seul clic ; économisant des milliers d'heures de travail. La fonctionnalité d'interopérabilité permet d'intégrer le code iOS converti dans Objective-C sans aucun problème, ce qui implique que vous pouvez explorer la myriade d'options offertes par Swift, puis l'intégrer dans votre projet Obj-C sans tout réécrire à la fois.
Préparez le code de votre application existante pour la conversion
Il est toujours préférable de commencer avec le dernier code Obj-C. En effet, Xcode utilise un convertisseur Objective-C moderne qui peut vous aider avec :
1. Changer l'id en type d'instance dans la mesure du possible
2. Utiliser les macros enum correctes
3. Mise à niveau vers la syntaxe @property la plus récente
Bien que le convertisseur facilite les mécanismes d'analyse et d'application des modifications potentielles, il ne décrit pas la sémantique du code. Il est donc conseillé à tous les développeurs d'applications iOS de tout vérifier manuellement une fois, puis de confirmer les modifications.
Pour utiliser le convertisseur, sélectionnez Edition -> Refactor -> Passer à la syntaxe Modern Objective-C.
Le processus de migration du code Objective-C vers Swift
L'approche la plus efficace pour convertir une application Objective-C complète en Swift est, pour commencer, une classe à la fois, en particulier une classe sans aucune sous-classe puisque vous ne pouvez pas sous-classer les classes Swift dans Obj-C.
Remplacez les fichiers .m et .h liés à la classe par un seul fichier .swift. Avec cela, tout, de l'interface à la mise en œuvre, entrera automatiquement dans le fichier Swift. De plus, vous n'avez pas besoin de créer un fichier d'en-tête car Xcode génère automatiquement un en-tête, si nécessaire.
Conception d'un fichier d'en-tête de pont
Lorsque vous ajoutez votre premier fichier .swift, vous trouverez une invite comme celle illustrée ci-dessous.
Cliquez sur l'option " Créer un en-tête de pontage ".
Un guide étape par étape
1. Choisissez une paire de fichiers .h et .m que vous souhaitez convertir en Swift. Si vous souhaitez convertir l'ensemble du projet, laissez la classe AppDelegate pour plus tard.
2. Recherchez #import "MyViewController.h" dans le code et supprimez-le du fichier d'en-tête Objective-C Bridging ([MyProject]-Bridging-Header.h).
3. Remplacez les instances de #import "[filename].h" par #import "[MyProject]-Swift.h" dans tous les fichiers .m et mettez @class [filename] au lieu de #import "[filename].h" dans tous les fichiers .h.
4. Transformez la partie des fichiers Obj-C en Swift. Cela peut être facilement fait en utilisant l'extension Finder de "Swiftify pour Xcode". Sinon, copiez le contenu des fichiers .m et .h vers .swift et utilisez l'option "Convertir le fichier en Swift" disponible dans l'extension Swiftify Xcode.
5. Remplacez les fichiers .h et .m par des fichiers .swift convertis dans le projet.
6. Compilez le projet et corrigez les erreurs de conversion. Bien que de nombreux problèmes soient facilement gérés à l'aide des suggestions de correction automatique de Xcode, vous pouvez également compter sur Swiftify pour signaler et corriger les erreurs apparaissant plusieurs fois dans le projet.
7. Une fois terminé, générez et exécutez le projet. Si le problème de "Classe introuvable" suivi d'un plantage se pose, recherchez toutes les références à celle-ci dans l'éditeur de storyboard. Entrez à nouveau le nom de la classe dans l'inspecteur d'identité, enregistrez et réessayez.
8. Si vous convertissez l'intégralité du projet, vous pouvez transformer la classe AppDelegate maintenant. À ce stade, tous les autres fichiers ont été convertis en Swift et donc, s'il ne reste plus de fichiers Obj-C dans la cible, vous pouvez facilement supprimer les fichiers main.m et .pch (en-tête précompilé).
Quelle pratique préférez-vous : créer une nouvelle application iOS dans Swift à partir de zéro ou convertir complètement Objective-C en Swift ? Partagez vos opinions via la section des commentaires ci-dessous.