// 待改良版
protocol Food { }
protoco lAnimal {
func eat(_food :Food)
}
struct Meat:Food{ }
struct Grass:Food{}
struct Tiger:Animal{
funceat(_food:Food) {//實(shí)現(xiàn)協(xié)議
//這里只有在運(yùn)行時(shí)才能檢查到谣沸,需要改進(jìn)首有,如果通過(guò)修改eat方法的參數(shù)屎即,就會(huì)出現(xiàn)編譯失敗
if food is Meat{
print("eat\(food) ")
}else{
fatalError("Tiger can only eat meat!")
}
}
}
let meat =Meat()
Tiger().eat(meat)
//方法參數(shù)的類型先不固定劈狐,來(lái)讓實(shí)現(xiàn)協(xié)議的類或者結(jié)構(gòu)體定義,但是代價(jià)是不能被當(dāng)做獨(dú)立的類型使用了
protocol Animal {
associatedtype F
func eat(_food : F)
}
struct Tiger:Animal{
func eat(_food:Meat) {//實(shí)現(xiàn)協(xié)議
print("eat\(food) ")
}
}
struct Sheep:Animal{
func eat(_food:Grass) {
print("eat\(food) ")
}
}
Tiger().eat(Meat())
Sheep().eat(Grass())
// Animal中包含了未確定類型又厉,早成下面的代碼出錯(cuò)
//原因:在一個(gè)協(xié)議中加入了像是associatedtype或者Self的約束后槽奕,它將只能被用為泛型約束看峻,而不能作為獨(dú)立的類型使用,也失去了動(dòng)態(tài)派發(fā)的特性
func isDangerous(animal:Animal) ->Bool{//錯(cuò)誤代碼
if animal is Tiger{
return true
}else{
return false
}
}
//將函數(shù)改為泛型函數(shù)就可以了
func isDangerous1(animal:T) ->Bool{
if animal isTiger{
return true
}else{
return false
}
}