githubに公開されているライブラリーのソースコードを確認すると、
自分がSwiftの基本的な文法で理解できてないものが多いので、
学習のメモとしてまとめてみます。
今回は、extentionの挙動を、継承も踏まえて確認してみました。
まずは、使用するクラスの定義をします。
// 基本となるクラス
class Food {
func show() -> String {
return "food"
}
}
// Foodを拡張したクラス
extension Food {
// 追加したメソッド
func aging() -> String {
return "aging food"
}
// 全く同じインターフェースのメソッドは追加できず、
// コンパイルエラー(Invalid redeclaration of show())となる
//func show() -> String {
// return "extended food"
//}
// これは可能
func show(with: String) -> String {
return "food with \(with)"
}
}
// Foodを継承したRiceクラス
class Rice : Food {
// ただのoverride
override func show() -> String {
return "rice"
}
// ↓のようなコンパイルエラーとなります。
// Declarations from extensions cannot be overridden yet
//override func aging() -> String {
// return "override aging food"
//}
}
ここでは、Foodを拡張させて、aging()を追加してみました。
なお、show()に関しては、上記のように追加できるものもあれば、できないものもあります。
そして、Riceでaging()をoverrideすると、コンパイラーにおこられます。
まだoverrideできないよという意味らしく、yetの意味が気になりますね。今後サポートされるのでしょうかね。
そもそもデザインパターン的にありえないとかそういう観点もあるのかもしれませんが、勉強不足にてちょっとわからないです。
次は、実際にメソッドを実行してみます。
var food = Food()
println(food.aging()) // aging food
println(food.show()) // food
println(food.show("sweet sauce")) // food with sweet sauce
var rice = Rice()
println(rice.aging()) // aging food
println(rice.show()) // rice
println(rice.show("curry")) // food with curry
という感じの挙動になります。
Foodを拡張させてaging()を追加させたことで、aging()が実行できるようになりました。
もちろん、Foodを継承したRiceも拡張されていて、
aging()やshow(with:String)が実行できます。
Riceのaging()は、上でも説明しましたが、overrideできず親クラスのメソッドとなります。
今日はこんなところで失礼します。
実際に上にソースコードをPlaygroundにコピペして実行し、
色々いじってみることを強くおすすめします。
おそらくその方が理解が深まると思います。