Swift From Scratch héritage et protocoles

Si vous avez lu les leçons précédentes de cette série, vous devriez déjà bien comprendre les bases du langage de programmation Swift. Nous avons parlé de variables, de constantes et de fonctions, et dans la leçon précédente, nous avons présenté les bases de la programmation orientée objet dans Swift..

Alors que les terrains de jeu sont un excellent outil pour jouer avec Swift et apprendre la langue, il est temps de passer à autre chose et de créer notre premier projet Swift dans Xcode. Dans cette leçon, nous allons créer les bases d’une application simple à faire utilisant Xcode et Swift. En cours de route, nous en apprendrons davantage sur la programmation orientée objet et examinerons de plus près l'intégration de Swift et d'Objective-C..

Conditions préalables

Si vous souhaitez suivre avec moi, assurez-vous que Xcode 8.3.2 ou une version supérieure est installé sur votre ordinateur. Xcode 8.3.2 est disponible sur l'App Store d'Apple.

1. Configuration du projet

Étape 1: Choisissez un modèle

Lancez Xcode 8.3.2 ou supérieur et sélectionnez Nouveau> Projet… du Fichier menu. Du iOS section, choisissez la Application à vue unique modèle et cliquez Suivant.

Étape 2: Configurez le projet

Nommez le projet Faire Et mettre La langue à Rapide. Assure-toi Dispositifs est réglé sur iPhone et les cases à cocher en bas ne sont pas cochées. Cliquez sur Suivant continuer.

Indiquez à Xcode où vous souhaitez stocker votre projet et cliquez sur Créer en bas à droite pour créer votre premier projet Swift.

2. Anatomie du projet

Avant de continuer notre voyage dans Swift, prenons un moment pour voir ce que Xcode a créé pour nous. Si vous débutez dans le développement Xcode et iOS, la plupart de ces choses seront nouvelles pour vous. En travaillant avec un projet Swift, vous aurez une meilleure idée de ce à quoi ressemblent les classes et les structures et de la façon dont elles se comportent dans Swift..

Le modèle de projet ne diffère pas beaucoup d'un projet créé avec Objective-C comme langage de programmation. Les différences les plus importantes sont liées à la AppDéléguer et ViewController Des classes.

Si vous avez déjà utilisé Objective-C dans le passé, vous remarquerez que le modèle de projet contient moins de fichiers. Il n'y a pas d'en-tête (.h) ou mise en œuvre (.m) fichiers à trouver dans notre projet. Dans Swift, les classes n'ont pas de fichier d'en-tête séparé dans lequel l'interface est déclarée. Au lieu de cela, une classe est déclarée et implémentée dans un seul .rapide fichier.

Notre projet contient actuellement deux fichiers Swift, un pour le AppDéléguer classe, AppDelegate.swift, et un autre pour le ViewController classe, ViewController.swift. Le projet comprend également deux story-boards, Tableau principal et LaunchScreen.storyboard. Nous allons travailler avec le scénario principal un peu plus tard dans cette leçon. Il ne contient actuellement que la scène pour le ViewController classe.

Quelques autres fichiers et dossiers sont inclus dans le projet, mais nous allons les ignorer pour le moment. Ils ne jouent aucun rôle important dans le cadre de cette leçon.

3. Héritage

La première chose que nous allons aborder dans cette leçon est l’héritage, un paradigme commun de la programmation orientée objet. Dans Swift, seules les classes peuvent hériter d'une autre classe. En d'autres termes, les structures et les énumérations ne prennent pas en charge l'héritage. C’est l’une des différences majeures entre les classes et les structures.

Ouvrir ViewController.swift pour voir l'héritage en action. L'interface et la mise en œuvre du ViewController la classe est plutôt simple, ce qui nous permet de nous concentrer sur l'essentiel.

UIKit

Au sommet de ViewController.swift, vous devriez voir une déclaration d'importation pour le framework UIKit. N'oubliez pas que la structure UIKit fournit l'infrastructure permettant de créer une application iOS fonctionnelle. La déclaration d'importation en haut rend cette infrastructure disponible pour nous dans ViewController.swift.

importer UIKit

Superclasse

Sous la déclaration d'importation, nous définissons une nouvelle classe nommée ViewController. Les deux points après le nom de la classe ne se traduisent pas par est de type comme nous l'avons vu plus tôt dans cette série. Au lieu de cela, la classe après les deux points est la superclasse de la ViewController classe. En d’autres termes, l’extrait suivant peut être lu comme suit: on définit une classe nommée ViewController qui hérite de UIViewController.

class ViewController: UIViewController 

Cela explique également la présence de la déclaration d'importation en haut de ViewController.swift depuis le UIViewController la classe est définie dans le framework UIKit.

Les dérogations

le ViewController La classe inclut actuellement deux méthodes, mais notez que chaque méthode est préfixée du passer outre mot-clé. Cela indique que les méthodes sont définies dans la superclasse de la classe - ou plus haut dans l’arborescence de l’héritage - et sont remplacées par le ViewController classe.

class ViewController: UIViewController Fonction de remplacement viewDidLoad () super.viewDidLoad () Fonction de remplacement didReceiveMemoryWarning () super.didReceiveMemoryWarning ()

le passer outre la construction n'existe pas dans Objective-C. En Objective-C, vous implémentez une méthode substituée dans une sous-classe sans indiquer explicitement qu'elle remplace une méthode plus haut dans l'arbre d'héritage. Le runtime d'Objective-C s'occupe du reste.

Même chose de vrai à Swift, le passer outre mots-clés ajoute la sécurité à la méthode prioritaire. Parce que nous avons préfixé le viewDidLoad () méthode avec le passer outre mot clé, Swift attend cette méthode dans la superclasse de la classe ou plus haut dans l'arbre d'héritage. En termes simples, si vous substituez une méthode qui n’existe pas dans l’arborescence de l’héritage, le compilateur renvoie une erreur. Vous pouvez tester cela en mal orthographiant le viewDidLoad () méthode comme indiqué ci-dessous.

4. Interface utilisateur

Déclarer des points de vente

Ajoutons une vue de tableau au contrôleur de vue pour afficher une liste d'éléments à faire. Avant de faire cela, nous devons créer un point de vente pour la vue de table. Un point de vente n'est rien d'autre qu'une propriété visible et pouvant être définie dans Interface Builder. Déclarer un point de vente dans le ViewController classe, nous préfixons la propriété, une variable, avec le @IBOutlet attribut.

class ViewController: UIViewController @IBOutlet var tableView: UITableView! Remplacer func viewDidLoad () super.viewDidLoad () Remplacer func didReceiveMemoryWarning () super.didReceiveMemoryWarning ()

Notez que la sortie est une option implicitement non emballée. Un quoi? Permettez-moi de commencer par dire qu'un point de vente doit toujours être un type facultatif. La raison est simple. Chaque propriété du ViewController La classe doit avoir une valeur après l'initialisation. Une prise de courant, cependant, n’est connectée à l’interface utilisateur qu’après l'exécution du programme. ViewController l'instance a été initialisée d'où le type optionnel.

Attends une minute. le tableView outlet est déclaré implicite non optionnel et non facultatif. Aucun problème. Nous pouvons déclarer le tableView sortie en option en remplaçant le point d'exclamation dans l'extrait ci-dessus par un point d'interrogation. Cela compilerait très bien. Cependant, cela signifierait également que nous aurions besoin de décompresser explicitement la propriété chaque fois que nous voulons accéder à la valeur stockée dans la valeur optionnelle. Cela deviendrait rapidement encombrant et prolixe.

Au lieu de cela, nous déclarons le tableView sortie en tant qu'option implicitement non encapsulée, ce qui signifie que nous n'avons pas besoin de dérouler explicitement l'option si nous devons accéder à sa valeur. En bref, une option implicitement non enveloppée est une option, mais nous pouvons accéder à la valeur stockée dans l'option comme une variable normale. Il est important de garder à l'esprit que votre application se bloquera si vous essayez d'accéder à sa valeur si aucune valeur n'a été définie. C'est le gotcha. Cependant, si la prise est correctement connectée, nous pouvons être certains que la prise est configurée lorsque nous essayons d’y accéder pour la première fois..

Points de connexion

Avec la prise déclarée, il est temps de la connecter dans Interface Builder. Ouvrir Tableau principal, et sélectionnez le contrôleur de vue. Choisir Intégrer dans> Contrôleur de navigation du Éditeur menu. Cela définit le contrôleur de vue comme contrôleur de vue racine d'un contrôleur de navigation. Ne t'en fais pas pour l'instant.

Faites glisser un UITableView exemple de la Bibliothèque d'objets à la vue du contrôleur de vue et ajoutez les contraintes de mise en page nécessaires. Avec la vue tableau sélectionnée, ouvrez le Inspecteur de connexions et définir la vue de la table la source de données et déléguer prises vers le contrôleur de vue.

Avec le Inspecteur de connexions toujours ouvert, sélectionnez le contrôleur de vue et connectez le tableView sortie à la vue de la table que nous venons d'ajouter. Cela relie le tableView sortie du ViewController classe à la vue de table.

5. Protocoles

Avant de pouvoir créer et exécuter l’application, nous devons implémenter la UITableViewDataSource et UITableViewDelegate protocoles dans le ViewController classe. Cela implique plusieurs choses.

Étape 1: Conformité aux protocoles

Nous devons dire au compilateur que le ViewController classe conforme à la UITableViewDataSource et UITableViewDelegate protocoles. La syntaxe ressemble à celle d'Objective-C.

classe ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate …

Les protocoles auxquels la classe se conforme sont listés après la superclasse, UIViewController dans l'exemple ci-dessus. Si une classe n'a pas de super classe, ce qui n'est pas rare dans Swift, les protocoles sont listés immédiatement après le nom de la classe et les deux points..

Étape 2: Mise en œuvre du UITableViewDataSource Protocole

Parce que le UITableViewDelegate protocole ne définit pas les méthodes requises, nous allons seulement mettre en œuvre la UITableViewDataSource protocole pour l'instant. Avant de le faire, créons une propriété de variable pour stocker les tâches que nous allons répertorier dans la vue tableau..

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate @IBOutlet var tableView: UITableView! Articles var: [String] = []…

Nous déclarons une propriété de variable articles de type [Chaîne] et définir un tableau vide, [], comme valeur initiale. Cela devrait maintenant sembler familier. Ensuite, implémentons les deux méthodes requises de la UITableViewDataSource protocole.

La première méthode requise, numberOfRows (inSection :), est facile. Nous renvoyons simplement le nombre d'articles stockés dans le articles propriété.

func tableView (_ tableView: UITableView, section numberOfRowsInSection: Int) -> Int return items.count

La seconde méthode requise, cellForRow (at :), besoin d'une explication. En utilisant la syntaxe en indice, nous demandons articles pour l'élément qui correspond à la ligne en cours.

func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // Extraire l'élément item = éléments [indexPath.row] // Dequeue Cell laisse cell = tableView.dequeueReusableCell (withIdentifier: "TableViewCell", pour: indexPath ) // Configurer la cellule cell.textLabel? .Text = item return cell

Nous demandons ensuite à la vue tableau une cellule avec identifiant "TableViewCell", en passant le chemin d'index pour la ligne en cours. Notez que nous stockons la cellule dans une constante, cellule. Il n'y a pas besoin de déclarer cellule en tant que variable.

Dans la ligne de code suivante, nous configurons la cellule de la vue tableau en définissant le texte de l'étiquette de texte avec la valeur suivante: article. Notez que dans Swift le textLabel propriété de UITableViewCell est déclaré comme un type optionnel d'où le point d'interrogation. Cette ligne de code pourrait être lue comme définir l'étiquette de texte texte propriété à article si textLabel n'est pas égal à néant. En d'autres termes, l'étiquette du texte texte propriété n'est définie que si textLabel n'est pas néant. Ceci est une construction de sécurité très pratique à Swift connue sous le nom chaînage optionnel.

Étape 3: Réutilisation des cellules

Il y a deux choses que nous devons régler avant de créer l'application. Tout d’abord, nous devons dire à la vue table qu’elle doit utiliser le UITableViewCell classe pour créer de nouvelles cellules de vue de tableau. Nous faisons cela en invoquant registerClass (_: forCellReuseIdentifier :), en passant dans le UITableViewCell classe et l'identificateur de réutilisation que nous avons utilisé plus tôt, "TableViewCell". Mettre à jour le viewDidLoad () méthode comme indiqué ci-dessous.

override func viewDidLoad () super.viewDidLoad () // classe de registre pour la réutilisation de cellules tableView.register (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")

Étape 4: Ajout d'éléments

Nous n'avons actuellement aucun élément à afficher dans la vue tableau. Ceci est facilement résolu en renseignant le articles propriété avec quelques articles à faire. Il y a plusieurs façons d'accomplir cela. J'ai choisi de peupler le articles propriété dans le viewDidLoad () méthode comme indiqué ci-dessous.

override func viewDidLoad () super.viewDidLoad () // Populate Items items = ["Buy Milk", "Terminer le tutoriel", "Play Minecraft"] // Enregistrement de la classe pour la réutilisation de cellules tableView.register (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")

6. Construire et exécuter

Il est temps de prendre notre application pour un tour. Sélectionner Courir de Xcode Produit menu ou hit Commande-R. Si vous avez suivi, vous devriez vous retrouver avec le résultat suivant.

Notez que j'ai ajouté un titre, Faire, en haut de la vue dans la barre de navigation. Vous pouvez faire la même chose en réglant la Titre propriété du ViewController par exemple dans le viewDidLoad () méthode.

override func viewDidLoad () super.viewDidLoad () // Set title title = "À faire" // Remplir les éléments items = ["Acheter du lait", "Terminer le didacticiel", "Lire Minecraft"] // Enregistrer la classe pour la réutilisation des cellules tableView.register (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")

Conclusion

Même si nous venons de créer une application simple, vous avez appris pas mal de choses nouvelles. Nous avons exploré les méthodes d'héritage et de substitution. Nous avons également abordé les protocoles et comment adopter la UITableViewDataSource protocole dans le ViewController classe. Cependant, la chose la plus importante que vous ayez apprise est la manière d’interagir avec les API Objective-C..

Il est important de comprendre que les API du SDK iOS sont écrites en Objective-C. Swift a été conçu pour être compatible avec ces API. S'appuyant sur ses échecs passés, Apple a compris que Swift devait être capable de se connecter au SDK iOS sans avoir à réécrire chaque API dans Swift..

Il est possible de combiner Objective-C et Swift, mais certaines mises en garde seront explorées plus en détail ultérieurement. En se concentrant sans cesse sur la sécurité, Swift doit surmonter quelques obstacles de temps à autre. Cependant, aucun de ces obstacles n’est trop important, comme nous le verrons dans la leçon suivante, dans laquelle nous continuons à travailler sur notre application Tâches..

En attendant, consultez certains de nos autres cours et tutoriels sur le développement iOS en langage Swift!