2015-06-29 7 views
21

Ich versuche, Protokoll zu erweitern, so dass es mehrere Einschränkungen aus anderen Protokollen erfüllen kann. Wie kann ich den Code so anpassen, dass er korrekt ist? Vielen Dank.So erweitern Sie ein Protokoll, das mehrere Bedingungen erfüllt - Swift 2.0

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

Oder fügen Sie einfach den Erfüllungen nacheinander:

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

enter image description here

+0

By the way, das endgültige Codebeispiel zu sehen, dass ich schrieb, besuchen Sie bitte: http://audreyli.me/2015/06/29/strategy-design-pattern-updated-using-protocol-extension- in-swift-2-0/ –

Antwort

45

Sie ein protocol composition verwenden könnte

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

Das ist großartig für, wenn es beiden entsprechen muss, aber was ist, wenn Sie für die eine oder andere Konformität überprüfen möchten? Etwas in der Art von: Erweiterung Beweglich wo Selbst: Protokoll ... – Dylan

+1

@Dylan, anstelle der Übereinstimmungsprüfung wird diese Syntax verwendet, um zu sagen, dass ein Typ einem Protokoll entspricht. Um die Konformität mit einem Protokoll zu überprüfen, werfen Sie einen Blick auf die Antwort von AirspeedVelocity http://stackoverflow.com/questions/28124684/swift-check-if-generic-type-conforms-to-protocol – ABakerSmith

+0

Offenbar gibt es eine neue Syntax, und die Protokoll <..> wurde entfernt. Verwenden Sie die & -Syntax in Swift 4. –

27

Ab dem Zeitpunkt von diesem Post, Die Antwort lautet protocol<Animal, Aged>.

In Swift 3.0 ist protocol<Animal, Aged> veraltet.

Die korrekte Verwendung in Swift 3.0 ist:

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

Sie auch die Protokolle mit einem typealias kombinieren. Dies ist nützlich, wenn Sie eine Kombination von Protokollen an mehreren Stellen verwenden (Vermeidung von Doppelarbeit und Förderung der Wartbarkeit).

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

Ich weiß, dass einige Zeit vergangen ist, aber Typen Typen werden nicht in Objective-C (z. B. zur Überprüfung der Protokollkonformität) kommen. Am Ende habe ich folgendes getan: '@objc public protocol AgedAnimal: Aged, Animal {}' – balthisar