Swift не может специализировать универсальный параметр, когда тип специализации ограничен дополнительным протоколом - PullRequest
2 голосов
/ 24 июня 2019

Представьте себе следующий сценарий:

class Food {}

protocol Growable {}

class Animal<T: Food> {}

let animal1 = Animal<Food>() // Ok
let animal2 = Animal<Food & Growable>() // Compile error: 'Animal' requires that 'Food & Growable' inherit from 'Food'

Очевидно, что если у нас есть переменная типа Food & Growable, эта переменная также имеет тип Food.Тем не менее, общий параметр T класса Animal не может быть специализирован с типом Food & Growable.Почему это так?

1 Ответ

1 голос
/ 24 июня 2019

Сообщение об ошибке немного странно, но то, что вы пытаетесь сделать, неверно.

Вы не можете создавать обобщения с использованием протоколов. При создании универсального, вы должны использовать конкретный тип . Не протокол.

Food & Growable не является конкретным типом .

Вам потребуется подкласс:

class GrowableFood: Food, Growable {
   ...
}

let animal2 = Animal<GrowableFood>()

или вы можете расширить Animal, если Food равно Growable:

extension Animal where T: Growable {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...