Если я правильно понял, вам нужен способ написать функцию, которая печатает имя конформера Eat
, название еды и пищевую ценность еды.
Ваш текущий протокол Food
не получилдостаточно информации о пищевой ценности пищи (кальций, калории, клетчатка).Вы должны отредактировать свой протокол:
protocol Food {
var name: String { get }
var nutritionalValueName: String { get }
var nutritionalValue: Float! { get }
}
и реализовать 2 новых свойства в конформерах Food
.Вот пример:
struct Grass: Food {
var name: String { return "Grass" }
var calcium: Float!
var nutritionalValue: Float! { return calcium }
var nutritionalValueName: String { return "Calcium" }
}
Теперь вы можете написать функцию.Обратите внимание, что, поскольку Eat
имеет связанный тип, его нельзя использовать непосредственно в качестве типа параметра, необходимо ввести универсальный параметр T
и ограничить его значением Eat
:
func printEat<T: Eat>(eat: T) {
print(eat.name)
print(eat.itsFood.name)
print("\(eat.itsFood.nutritionalValueName): \(eat.itsFood.nutritionalValue!)")
}
Функциятело довольно очевидно.
Вы можете назвать это так:
printEat(eat: Cow())
printEat(eat: People())
printEat(eat: Reptile())
Вывод:
Cow
Grass
Calcium: 100.0
People
Rice
Calories: 1000.0
Reptile
Insect
Fiber: 300.0