質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

980閲覧

Swift as?演算子によるAnyObject型から他のプロトコル型へのダウンキャストについて

moriman

総合スコア615

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/02/12 05:11

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プロトコルを継承している、ということなんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/02/12 07:15

AnyObject は class 型ですが、HasArea は struct かも知れず、厳密にはダウンキャストというのはおかしいですね。as? や as! は親子関係のない(失敗する可能性のある)型変換にも使えるキャスト演算子ってことでしょう。
guest

回答1

0

as?は、Type Cast Operatorと呼ばれていると思います。

you can try to downcast to the subclass type with a type cast operator (as? or as!)

https://docs.swift.org/swift-book/LanguageGuide/TypeCasting.html

ダウンキャスト演算子、ではないのではないでしょうか。

投稿2020/02/12 08:20

編集2020/02/12 08:22
eytyet

総合スコア803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問