web-dev-qa-db-fra.com

Comment étendre un protocole qui répond à de multiples contraintes - Swift 2.0

J'essaie d'étendre le protocole afin qu'il puisse satisfaire plusieurs contraintes d'autres protocoles. Comment puis-je ajuster le code pour qu'il soit correct? Merci beaucoup. 

extension Moveable where Self: Animal && Self: Aged {
    public var canMove: Bool { return true }
}

enter image description here

23
Audrey Li

Vous pouvez utiliser une composition protocole

extension Moveable where Self: protocol<Animal, Aged> {
    // ... 
}

Ou simplement ajouter les conformités les unes après les autres:

extension Moveable where Self: Animal, Self: Aged {
    // ... 
}
54
ABakerSmith

Au moment de cet article, la réponse utilise protocol<Animal, Aged>.

Dans Swift 3.0, protocol<Animal, Aged> est obsolète.

L'utilisation correcte dans Swift 3.0 est:

extension Moveable where Self: Animal & Aged {
    // ... 
}

Vous pouvez également combiner les protocoles avec une typealias. Ceci est utile lorsque vous utilisez une combinaison de protocoles à plusieurs endroits (évite les doublons et favorise la maintenabilité).

typealias AgedAnimal = Aged & Animal
extension Moveable where Self: AgedAnimal {
    // ... 
}
29
kgaidis

Depuis Swift 3, vous pouvez utiliser typealias pour créer des types conformes à plusieurs protocoles:

typealias AgedAnimal = Animal & Aged

Donc, votre code deviendrait:

extension Moveable where Self: AgedAnimal {
    // ...
}

Ou comme ceci:

typealias Live = Aged & Moveable

extension Animal where Self: Live {
    // ...
}
0
xcocoader