2015-06-29 2 views
21

Я пытаюсь расширить протокол, чтобы он мог удовлетворить множество ограничений из других протоколов. Как я могу настроить код, чтобы он был правильным? Огромное спасибо.Как расширить протокол, который удовлетворяет множественным ограничениям - Swift 2.0

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

enter image description here

+0

Кстати, чтобы увидеть окончательный пример кода, который я написал, на сайте: http://audreyli.me/2015/06/29/strategy-design-pattern-updated-using-protocol-extension- in-swift-2-0/ –

ответ

45

Вы можете использовать protocol composition:

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

Или просто добавьте несоответствиями один за другим:

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

Это здорово, когда он должен соответствовать обоим, но как насчет того, хотите ли вы проверить соответствие для одного или другого? Что-то по строкам: расширение Movable where Self: protocol ... – Dylan

+1

@Dylan, вместо проверки соответствия этот синтаксис используется, чтобы сказать, что тип соответствует протоколу. Чтобы проверить соответствие протокола, посмотрите на ответ AirspeedVelocity здесь http://stackoverflow.com/questions/28124684/swift-check-if-generic-type-conforms-to-protocol – ABakerSmith

+0

По-видимому, существует новый синтаксис, и протокол <..> удален. Используйте синтаксис в синтаксисе Swift 4. –

27

По состоянию на время этого поста, ответ используется protocol<Animal, Aged>.

В Swift 3.0, protocol<Animal, Aged> устарели.

Правильное использование в Swift 3.0:

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

Вы также можете комбинировать протоколы с typealias. Это полезно, если вы используете комбинацию протоколов в нескольких местах (избегаете дублирования и повышаете ремонтопригодность).

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

Я знаю, что прошло некоторое время, но типы typealias не будут встречаться в Objective-C (например, для проверки соответствия протокола). Я закончил это: '@objc public protocol AgedAnimal: Aged, Animal {}' – balthisar

Смежные вопросы