2015-06-29 15 views
21

Próbuję rozszerzyć protokół, aby mógł spełnić wiele ograniczeń z innych protokołów. Jak mogę skorygować kod, aby był poprawny? Dziękuję bardzo.Jak rozszerzyć protokół spełniający wiele ograniczeń - Swift 2.0

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

enter image description here

+0

Nawiasem mówiąc, aby zobaczyć ostateczną próbkę kodu, który napisałem, wizyta: http://audreyli.me/2015/06/29/strategy-design-pattern-updated-using-protocol-extension- in-swift-2-0/ –

Odpowiedz

45

można użyć protocol composition:

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

Lub po prostu dodać conformances jeden po drugim:

extension Moveable where Self: Animal, Self: Aged { 
    // ... 
} 
+1

To jest świetne, gdy musi być zgodne z obiema, ale co jeśli chcesz sprawdzić zgodność dla jednego LUB drugiego? Coś w rodzaju: extension Movable gdzie Self: protocol ... – Dylan

+1

@Dylan, zamiast sprawdzać zgodność, ta składnia służy do stwierdzenia, że ​​typ jest zgodny z protokołem. Aby sprawdzić zgodność z protokołem, spójrz na odpowiedź AirspeedVelocity tutaj http://stackoverflow.com/questions/28124684/swift-check-if-generic-type-conforms-to-protocol – ABakerSmith

+0

Podobno jest nowa składnia, a protokół <..> został usunięty. Użyj & składni w Swift 4. –

27

Od czasu tego postu, odpowiedź jest przy użyciu protocol<Animal, Aged>.

W Swift 3.0, protocol<Animal, Aged> jest przestarzałe.

Prawidłowe wykorzystanie w Swift 3.0 jest:

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

Można również połączyć protokoły z typealias. Jest to przydatne, gdy używasz kombinacji protokołów w wielu miejscach (unika się powielania i promuje łatwość konserwacji).

typealias AgedAnimal = Aged & Animal 
extension Moveable where Self: AgedAnimal { 
    // ... 
} 
+0

Wiem, że minęło trochę czasu, ale typy typów nie pojawią się w Objective-C (np. W celu sprawdzenia zgodności protokołu). Skończyło się na tym: '@objc public protocol AgedAnimal: Aged, Animal {}' – balthisar

Powiązane problemy