protocol HasArea { var area: Double { get } } class Circle: HasArea { let pi = 3.1415927 var radius: Double var area: Double { return pi * radius * radius } init(radius: Double) { self.radius = radius } } class Country: HasArea { var area: Double init(area: Double) { self.area = area } } class Animal { var legs: Int init(legs: Int) { self.legs = legs } } let objects: [AnyObject] = [ Circle(radius: 2.0), Country(area: 243_610), Animal(legs: 4) ] for object in objects { if let objectWithArea = object as? HasArea { print("Area is (objectWithArea.area)") } else { print("Something that doesn't have an area") } } //Area is 12.5663708 //Area is 243610.0 //Something that doesn't have an area
https://docs.swift.org/swift-book/LanguageGuide/Protocols.html
上記ページのChecking for Protocol Conformanceのサンプルです。
まずas?はダウンキャスト演算子、ということでダウンキャストすると思うのですが、
ドキュメントのタイプキャスティングのページではクラス階層の中でのダウンキャストの説明があり、
スーパークラスの抽象的な型からサブクラスの具体的な型へのダウンキャストについては、「上位から下位」ということで「ダウンキャスト」でなんの疑問も無いのですが、
上記サンプルの場合プロトコルAnyObject型→プロトコルHasArea型へのダウンキャストということだと思います。
プロトコルにも継承があるので、例えば、HasAreaプロトコルの定義として、
protocol HasArea : AnyObject{ var area: Double { get } }
のように継承しているのなら、継承元から継承先への「ダウンキャスト」だと思うのですが、上記サンプルでは継承を宣言していません。「プロトコルAnyObject型→プロトコルHasArea型」はダウンキャストなのでしょうか?
まあ結果を見ればダウンキャストできているわけですが、全てのプロトコルは定義した時点で自動的にAnyObjectプロトコルを継承している、ということなんでしょうか?