Ответ 1
Вы можете использовать композицию протокола :
extension Moveable where Self: protocol<Animal, Aged> {
// ...
}
Или просто добавьте соответствия друг за другом:
extension Moveable where Self: Animal, Self: Aged {
// ...
}
Я пытаюсь расширить протокол, чтобы он мог удовлетворить несколько ограничений из других протоколов. Как я могу настроить код так, чтобы он был правильным? Огромное спасибо.
extension Moveable where Self: Animal && Self: Aged {
public var canMove: Bool { return true }
}
Вы можете использовать композицию протокола :
extension Moveable where Self: protocol<Animal, Aged> {
// ...
}
Или просто добавьте соответствия друг за другом:
extension Moveable where Self: Animal, Self: Aged {
// ...
}
На момент публикации этого сообщения ответ использует 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 {
// ...
}
Начиная с Swift 3, вы можете использовать typealias
для создания типов, которые соответствуют нескольким протоколам:
typealias AgedAnimal = Animal & Aged
Таким образом, ваш код станет:
extension Moveable where Self: AgedAnimal {
// ...
}
Или вот так:
typealias Live = Aged & Moveable
extension Animal where Self: Live {
// ...
}