Menu
Coddy logo textTech

Contrôle d’accès

Fait partie de la section Programmation orientée objet du Journey Swift de Coddy. Leçon 17 sur 57.

L’encapsulation signifie qu’un type contrôle la manière dont ses données peuvent être utilisées. Le contrôle d’accès détermine qui peut voir une propriété ou une méthode. Marquer un membre comme private le masque de tout code situé en dehors du type (ainsi que de ses extensions dans le même fichier) :

struct Account {
    private var balance = 0

    mutating func deposit(_ amount: Int) {
        balance += amount
    }
}

var a = Account()
a.deposit(50)
// a.balance = 1_000_000   // erreur : 'balance' est inaccessible en raison du niveau de protection 'private'

Le code extérieur ne peut alors utiliser que ce que le type propose. Le type peut vérifier chaque modification, de sorte que ses données ne se retrouvent jamais dans un état que le type n’autorise pas :

struct Account {
    private var balance = 0

    mutating func deposit(_ amount: Int) {
        if amount > 0 { balance += amount }
    }

    func report() -> String {
        "balance: \(balance)"
    }
}

var a = Account()
a.deposit(50)
a.deposit(-999)
print(a.report())

Sortie :

balance: 50

Swift possède cinq niveaux d’accès. Sans mot-clé, un membre est internal : visible partout dans le même module (votre application ou votre package). Les niveaux du plus ouvert au plus restreint :

open        // d'autres modules peuvent l'utiliser et le sous-classer (classes uniquement)
public      // d'autres modules peuvent l'utiliser
internal    // par défaut : le module entier
fileprivate // ce fichier source uniquement
private     // ce type (et ses extensions dans le fichier)

Les méthodes d’assistance privées réduisent l’interface publique : les appelants voient ce que fait le type, et non comment il le fait.

struct Password {
    private let text: String

    init(_ text: String) { self.text = text }

    var isStrong: Bool {
        hasDigit() && text.count >= 8
    }

    private func hasDigit() -> Bool {
        text.contains { $0.isNumber }
    }
}

print(Password("secret123").isStrong)
print(Password("short1").isStrong)

Sortie :

true
false
challenge icon

Défi

Facile

Complétez la struct Locker. Ses code et items sont private. store(_:code:) ajoute un élément uniquement lorsque le code correspond et renvoie si l’opération a réussi ; items(code:) renvoie les éléments stockés joints par , (ou empty) lorsque le code correspond, et wrong code dans le cas contraire.

Le code fourni lit le code du casier, puis les commandes put <code> <item> ou open <code>. Il affiche stored ou denied pour chaque commande put, ainsi que le résultat pour chaque commande open.

Votre code doit être placé dans Locker.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) }
var locker = Locker(code: input[0])
for cmd in input.dropFirst() {
    let p = cmd.split(separator: " ").map(String.init)
    if p[0] == "put" {
        print(locker.store(p[2], code: p[1]) ? "stored" : "denied")
    } else {
        print(locker.items(code: p[1]))
    }
}
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