2
where
句では、ジェネリックパラメータを特定のプロトコルから継承するプロトコルに制限することはできません。プロトコルから継承するプロトコルにジェネリックパラメータを制限する
protocol Edible {}
protocol PetFood: Edible {}
struct CatFood: PetFood {}
struct Rocks {}
func eat<T: Edible>(_ item: T) -> String {
return "Just ate some \(type(of: item))"
}
let food: CatFood = CatFood()
eat(food) //"Just ate some CatFood"
let moreFood: PetFood = CatFood()
//eat(moreFood) //Cannot invoke 'eat' with an argument list of type '(PetFood)'
func eatAnything<T>(_ item: T) -> String {
return "Just ate some \(type(of: item))"
}
eatAnything(moreFood) //This works, obviously
eatAnything(Rocks()) //But, of course, so does this...
プロトコルの種類を許可するようeatAnything()
を制限する方法はありますが、唯一のEdible
から継承したもの?あなたの例では
まあでなければならない、必ず - それは質問を実証するだけの簡単な例です。 – andyvn22
@ andyvn22私の答えを更新しました –