// 待改良版
protocol Food { }
protoco lAnimal {
func eat(_food :Food)
}
struct Meat:Food{ }
struct Grass:Food{}
struct Tiger:Animal{
funceat(_food:Food) {//實現協議
//這里只有在運行時才能檢查到,需要改進,如果通過修改eat方法的參數,就會出現編譯失敗
if food is Meat{
print("eat\(food) ")
}else{
fatalError("Tiger can only eat meat!")
}
}
}
let meat =Meat()
Tiger().eat(meat)
//方法參數的類型先不固定,來讓實現協議的類或者結構體定義,但是代價是不能被當做獨立的類型使用了
protocol Animal {
associatedtype F
func eat(_food : F)
}
struct Tiger:Animal{
func eat(_food:Meat) {//實現協議
print("eat\(food) ")
}
}
struct Sheep:Animal{
func eat(_food:Grass) {
print("eat\(food) ")
}
}
Tiger().eat(Meat())
Sheep().eat(Grass())
// Animal中包含了未確定類型,早成下面的代碼出錯
//原因:在一個協議中加入了像是associatedtype或者Self的約束后,它將只能被用為泛型約束,而不能作為獨立的類型使用,也失去了動態派發的特性
func isDangerous(animal:Animal) ->Bool{//錯誤代碼
if animal is Tiger{
return true
}else{
return false
}
}
//將函數改為泛型函數就可以了
func isDangerous1(animal:T) ->Bool{
if animal isTiger{
return true
}else{
return false
}
}