Définir des protocoles
Fait partie de la section Programmation orientée objet du Journey Swift de Coddy. Leçon 27 sur 57.
Un protocole énumère des exigences (méthodes et propriétés) sans les implémenter. Un type se conforme au protocole en fournissant chaque exigence, et il peut alors être utilisé partout où le protocole est attendu :
protocol Describable {
func describe() -> String
}
struct Book: Describable {
let title: String
func describe() -> String { "Book: \(title)" }
}
print(Book(title: "Dune").describe())Sortie :
Book: DuneContrairement à l’héritage, un protocole fonctionne aussi bien pour les structures, les classes que les énumérations, et un type peut se conformer à de nombreux protocoles. Le protocole indique seulement ce qu’un type peut faire ; chaque type décide comment :
protocol Describable {
func describe() -> String
}
struct Point: Describable {
var x = 0, y = 0
func describe() -> String { "(\(x), \(y))" }
}
enum Level: Describable {
case low, high
func describe() -> String { self == .low ? "low" : "high" }
}
print(Point(x: 1, y: 2).describe())
print(Level.high.describe())Sortie :
(1, 2)
highLes exigences de propriété indiquent le type et précisent si la propriété est en lecture seule ({ get }) ou si elle peut également être modifiée ({ get set }). Une exigence { get } peut être satisfaite par une propriété stockée ou calculée :
protocol Named {
var name: String { get }
}
struct User: Named {
let name: String
}
struct Planet: Named {
var number: Int
var name: String { "Planet \(number)" }
}
print(User(name: "ada").name)
print(Planet(number: 3).name)Sortie :
ada
Planet 3Si un type prétend se conformer à un protocole mais ne respecte pas une exigence, il ne compile pas. Le compilateur vérifie chaque conformité ; le code qui utilise le protocole peut donc s’y fier :
protocol Priced {
var price: Int { get }
func discounted(by percent: Int) -> Int
}
// struct Ticket: Priced { var price = 10 }
// erreur : le type 'Ticket' ne se conforme pas au protocole 'Priced'Défi
FacileDéclarez un protocole Shape avec une propriété en lecture seule name (String) et une méthode area() renvoyant Double. Faites en sorte que les structures Rectangle (width, height) et Circle (radius, en utilisant 3.0 pour π afin de garder les nombres simples) s’y conforment, avec les noms rectangle et circle.
Le code fourni lit les lignes r,3,4 ou c,2, crée la forme correspondante et affiche rectangle: 12.0.
Votre code doit être placé dans Shape.swift, Rectangle.swift et Circle.swift. main.swift contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
// Code d'entrée/sortie fourni : le garder tel quel
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in input {
let p = line.split(separator: ",").map(String.init)
if p[0] == "r" {
let s = Rectangle(width: Double(p[1])!, height: Double(p[2])!)
print("\(s.name): \(s.area())")
} else {
let s = Circle(radius: Double(p[1])!)
print("\(s.name): \(s.area())")
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Classes et objets
Travailler avec des fichiersDéfinir des classesMéthodes et selfInitialiseursLes classes sont des référencesRécapitulatif - Carte de bibliothèque4Encapsulation
Contrôle d’accèsLecture seule depuis l’extérieurProtection de l’étatInitialiseurs pouvant échouerRécapitulatif - Compte bancaire7Polymorphisme et génériques
PolymorphismeConversion de typeFonctions génériquesTypes génériquesRécapitulatif - Calculateur de formes2Structures et types valeur
StructuresSémantique de valeurMéthodes mutantesStructure ou classeRécapitulatif - article d’inventaire5Héritage
Sous-classesRedéfinition des méthodesInitialiseurs et superfinal et hiérarchiesRécapitulatif - hiérarchie des employés8Protocoles standard
CustomStringConvertibleEquatableComparableHashableRécapitulatif - Tri personnalisé11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livres3Les propriétés en profondeur
Propriétés calculéesObservateurs de propriétésMembres statiquesÉnumérations avec méthodesRécapitulatif - Journal des températures6Protocoles
Définir des protocolesConformité des typesExtensions de protocolesProtocoles comme typesRécapitulatif - Système de paiementEntraînez-vous par vous-même : Playground Swift