以下のコードにつきまして、お聞きしたい部分があります。
class Car {} class Bike: Car {} class Track:Car {} let a: Car = Bike()
こちらなのですが、class Bike: Car {}
はCarクラスを継承したBikeクラスであると思うのですが、let a: Car = Bike()
こちらが何を意味しているのかが分かりません。インスタンス化した場合は対象のクラスのプロパティを使用できると認識しているのですが、let a: Car
このように型にクラスを指定した場合はどのような構造となるのでしょうか...?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
let a: Car = Bike()
こちらが何を意味しているのかが分かりません。
何がわからないのかがわかりません。Car
型として宣言した変数のa
に、Car
のサブクラスであるBike
のオブジェクトを入れているだけです。
投稿2019/11/30 02:45
総合スコア145967
0
Swiftは普段あまり触らないので、話半分くらいに見ていただきたいですが……
Dec 2, 2019 9:55pm追記: Macを触れる環境に来たので修正しました
swift
1 2// MARK: - 3class Car { 4 var name: String 5 var wheelsQty: Int 6 7 init(name: String) { 8 self.name = name 9 self.wheelsQty = 4 10 } 11 12 func run() { 13 print("Go ahead (self.name), zoom-zoom!") 14 } 15} 16 17// MARK: - 18class Bike: Car { 19 var hasSidecar: Bool 20 21 init(name: String, hasSidecar: Bool) { 22 self.hasSidecar = hasSidecar 23 super.init(name: name) 24 self.wheelsQty = 2 25 } 26} 27 28// MARK: - 29class Truck: Car { 30 var specialSigns: Array<String> 31 32 init(name: String, specialSigns: Array<String>) { 33 self.specialSigns = specialSigns 34 super.init(name: name) 35 } 36 37 override func run() { 38 print("Vrrr, Vrrrr, Vrrrrrrom!!!!") 39 } 40} 41 42// MARK: - 43class ViewController: UIViewController { 44 required init?(coder: NSCoder) { 45 super.init(coder: coder) 46 } 47 48 let touring = Bike(name: "Touring", hasSidecar: true) 49 let hayabusa: Car = Bike(name: "Hayabusa", hasSidecar: true) 50 let canter = Truck(name: "CANTER", specialSigns: ["危", "毒"]) 51 let elf: Car = Truck(name: "ELF", specialSigns: []) 52 53 override func viewDidLoad() { 54 print("(touring.hasSidecar)") // -> true 55 print("(hayabusa.hasSidecar)") // -> ERROR 56 57 print("(canter.specialSigns)") // -> ["危", "毒"] 58 print("(elf.specialSigns)") // -> ERROR 59 } 60}
投稿2019/12/02 07:55
編集2019/12/02 12:55総合スコア2982
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/03 00:14 編集
2019/12/03 00:12 編集
2019/12/03 00:21 編集
2019/12/03 00:57 編集
0
追記
swift
1 2class Car { 3 let carStr = "carStr" 4} 5 6class Bike: Car { 7 let bikeStr = "bikeStr" 8} 9 10let a: Car = Bike() 11 12print("type(of: a): (type(of: a))") // => Bike 13 14// ↓これだと両方ともtrueになってしまう 15print("a is Car : ( a is Car )") // => true (`is` test is always true) 16print("a is Bike: ( a is Bike )") // => true 17// どちらの型で扱えばいいかわからない 18print("a.carStr: (a.carStr)") // => carStr 19print("a.bikeStr: (a.bikeStr)") // => compileError: Value of type `Car` has no member `bikeStr`
もともと
回答ではなく質問になってしまいますが。(コードあるのでこっちに書きます)
swift
1 2class Car {} 3class Bike: Car {} 4 5let a: Car = Bike() 6 7print("type Of a: (type(of: a))") // => type Of a: Bike 8 9
と、a
はBike
クラスとなってしまうので、クラス記述の実用性はなく?、代入できることを説明することを目的とした記述なのでしょうか?
投稿2019/11/30 03:27
編集2019/12/05 05:26退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/30 03:31
2019/11/30 03:32
2019/11/30 03:34
2019/12/01 18:45
2019/12/02 00:00
2019/12/02 06:46
2019/12/02 07:40
退会済みユーザー
2019/12/02 07:45
退会済みユーザー
2019/12/02 08:07
2019/12/04 06:27
2019/12/04 06:56
退会済みユーザー
2019/12/05 05:28 編集
2019/12/05 05:40 編集
2019/12/05 05:58 編集
退会済みユーザー
2019/12/05 06:16 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/30 02:52 編集
2019/11/30 02:54
2019/11/30 03:04 編集
2019/11/30 03:06
2019/11/30 03:07
2019/11/30 03:11
2019/11/30 03:14
2019/11/30 03:21
2019/11/30 03:24