LoginSignup
6
6

More than 5 years have passed since last update.

Swiftのextensionの挙動をゆる〜く確認してみた

Posted at

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にコピペして実行し、
色々いじってみることを強くおすすめします。
おそらくその方が理解が深まると思います。

6
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6