https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
Swift
1class Food { 2 var name: String 3 init(name: String) { 4 self.name = name 5 } 6 convenience init() { 7 self.init(name: "[Unnamed]") 8 } 9} 10 11class RecipeIngredient: Food { 12 var quantity: Int 13 init(name: String, quantity: Int) { 14 self.quantity = quantity 15 super.init(name: name) 16 } 17 override convenience init(name: String) { 18 self.init(name: name, quantity: 1) 19 } 20} 21 22class ShoppingListItem: RecipeIngredient { 23 var purchased = false 24 var description: String { 25 var output = "(quantity) x (name)" 26 output += purchased ? " ✔" : " ✘" 27 return output 28 } 29} 30 31var breakfastList = [ 32 ShoppingListItem(), 33 ShoppingListItem(name: "Bacon"), 34 ShoppingListItem(name: "Eggs", quantity: 6), 35] 36breakfastList[0].name = "Orange juice" 37breakfastList[0].purchased = true 38for item in breakfastList { 39 print(item.description) 40} 41// 1 x Orange juice ✔ 42// 1 x Bacon ✘ 43// 6 x Eggs ✘
上記のSwiftドキュメントページのイニシャライザについてなんですが、イニシャライザの継承の挙動について、
混乱しています。
ShoppingListItemクラスには自身のプロパティ(purchased)にデフォルト値があり、
指定イニシャライザを定義していないので、スーパークラスであるRecipeIngredientの
指定イニシャライザ・コンビニエンスイニシャライザを継承する、ということで
breakfastList[2]で考えてみます。
ShoppingListItem(name: "Eggs", quantity: 6)
が実行されると、ShoppingListItemが継承した、RecipeIngredientの指定イニシャライザが呼び出されるのだと思います。
継承したRecipeIngredientの指定イニシャライザは、
init(name: String, quantity: Int) { self.quantity = quantity super.init(name: name) }
↑な訳ですが、継承しているので、上記のselfは、ShoppingListItemにとってのself、つまりShoppingListItem
上記のsuperはShoppingListItemにとってのsuper、つまりRecipeIngredient
というのが現在の認識なのですが、
そうすると、上記の
super.init(name:name)
は、RecipeIngredientのinit(name:name)、つまりRecipeIngredientのコンビニエンスイニシャライザが呼び出される、ということになり、そうするとquantityプロパティに1がセットされる訳ですが、
非常に複雑で訳がわからない(辻褄が合わない)し、結果を見ても違うようです。
ただ、これの一つ前の、RecipeIngredientクラスがFoodクラスのコンビニエンスイニシャライザを継承する説明では
やはり上記のように考えているようなので、ShoppingListItemのイニシャライザの継承はどう考えれば良いのかわからない状態です。
多分何か勘違いしているのだと思うのですが、どう考えれば良いでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。