2015-06-29 9 views
21

Sto provando ad estendere il protocollo in modo che possa soddisfare più vincoli da altri protocolli. Come posso regolare il codice in modo che sia corretto? Grazie mille.Come estendere un protocollo che soddisfa i vincoli multipli - Swift 2.0

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

enter image description here

+0

Tra l'altro, per vedere l'esempio di codice finale che ho scritto, visita: http://audreyli.me/2015/06/29/strategy-design-pattern-updated-using-protocol-extension- in-swift-2-0/ –

risposta

45

È possibile utilizzare un protocol composition:

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

O semplicemente aggiungere le conformità che uno dopo l'altro:

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

Questo è ottimo per quando deve essere conforme a entrambi, ma cosa succede se si desidera verificare la conformità per uno O l'altro? Qualcosa sulla falsariga di: estensione mobile dove Self: protocollo ... – Dylan

+1

@Dylan, invece di verificare la conformità, questa sintassi viene utilizzata per dire che un tipo è conforme a un protocollo. Per verificare la conformità a un protocollo dai un'occhiata alla risposta di AirspeedVelocity qui http://stackoverflow.com/questions/28124684/swift-check-if-generic-type-conforms-to-protocol – ABakerSmith

+0

Apparentemente c'è una nuova sintassi, e il protocollo <..> è stato rimosso. Usa la sintassi & in Swift 4. –

27

Fino al momento di questo post, la risposta sta usando protocol<Animal, Aged>.

In Swift 3.0, protocol<Animal, Aged> è obsoleto.

L'utilizzo corretto di Swift 3.0 è:

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

È inoltre possibile combinare i protocolli con un typealias. Ciò è utile quando si utilizza una combinazione di protocolli in più posizioni (evita la duplicazione e promuove la gestibilità).

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

So che è passato del tempo, ma i tipi di tipalità non si imbatteranno in Objective-C (ad es. Per verificare la conformità del protocollo). Ho finito per fare questo: '@objc protocollo pubblico AgedAnimal: Aged, Animal {}' – balthisar

Problemi correlati