Menu
Coddy logo textTech

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: Dune

Contrairement à 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)
high

Les 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 3

Si 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'
challenge icon

Défi

Facile

Dé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())")
    }
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Playground Swift