Silex v0.47.1 / Docs Source canonique ↗

Définir un contrat avec un protocole

Un protocole déclare les méthodes qu'un type conforme doit fournir.

protocol Drawable {
    func draw()
}

struct Sprite:Drawable {
    func draw() {
        print("sprite")
    }
}

func main() {
    var drawable:Drawable = Sprite()
    drawable.draw()
}

La conformance est nominale : le type doit citer le protocole. Une méthode de la bonne forme ne suffit pas à elle seule.

Exiger une propriété

Un protocole peut demander une lecture, ou une lecture et une écriture, sans imposer de stockage :

protocol Named {
    name:str { get }
}

protocol Renamable {
    name:str { get set }
}

Un champ let ou var compatible satisfait { get }. Un champ var ou une propriété var satisfait { get set } ; son setter peut être implicite ou explicite. let et var ne sont pas admis dans le protocole lui-même. Consultez le contrat complet des propriétés.

Conserver une valeur conforme

var drawable:Drawable = Sprite()
drawable.draw()

Une valeur de protocole expose seulement les exigences du protocole. Une structure est copiée dans cette valeur dynamique ; une classe conserve son identité partagée. Les appels à travers une valeur de protocole sont traités comme modifiables, donc un récepteur direct se déclare avec var.

Contraindre une spécialisation

func render<T:Drawable>(value:T) {
    value.draw()
}

render(Sprite())

Le compilateur spécialise la fonction pour le type concret. À ce site d'appel, le protocole ne crée donc aucun conteneur effacé. Un paramètre de type accepte au plus une contrainte de protocole.

Une classe peut citer d'abord une unique classe de base, puis des protocoles. Une structure cite seulement des protocoles. Une classe dérivée hérite des conformances valides de sa base.

Revenir aux types de données · Ajouter une conformance avec une extension