protocol Animal { func bark() } struct Dog: Animal { func bark() { print("わんわん") } } func f<A: Animal>(_ animal: A) { ... } // これはOK let dog: Dog = Dog() f(dog) // こっちはNG // error: cannot invoke 'f' with an argument list of type '(Animal)' let animal: Animal = Dog() f(animal) 毎度話題に上がるたびに「で、なんでなんだっけ?」となってしまうので、備忘録を兼ねてQiitaに投稿しておきます! 「存在型というものの存在自体は聞いたことがあって、それがSwiftで使われていることもなんとなく知っている」くらいの方を想定して説明