Подтвердить что ты не робот

Как расширить протокол, который удовлетворяет нескольким ограничениям - Swift 2.0

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

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

enter image description here

4b9b3361

Ответ 1

Вы можете использовать композицию протокола :

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

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

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

Ответ 2

На момент публикации этого сообщения ответ использует 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 {
    // ... 
}

Ответ 3

Начиная с Swift 3, вы можете использовать typealias для создания типов, которые соответствуют нескольким протоколам:

typealias AgedAnimal = Animal & Aged

Таким образом, ваш код станет:

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

Или вот так:

typealias Live = Aged & Moveable

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