[Swift] クラスプロパティをオーバーライドする

Swift

Swift で 親クラスで定義されているプロパティを子クラスでオーバーライドする方法を説明します。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Big Sur 11.2.3
  • Xcode 12.4
  • iOS 14.4
[Swift] プロパティのオーバーライドの方法

クラスプロパティのオーバーライド

Swift では、struct が主役になっていますが、class を使う機会もまだ多くあります。

Class の stored property を子クラスでオーバーライドする方法は、よく紹介されていますが、

「クラスプロパティ をオーバーライドする方法」は、知らない人の方が多いのではないでしょうか?

あまり必要性も発生しないので、気にしていない人も多いと思いますが、その方法を説明します。

クラスプロパティ?

クラスプロパティは、クラスのインスタンスに属するプロパティではなく、クラス自体に付与されるプロパティです。

Swift では、クラス定義中に、static を付与して定義することで、クラスプロパティとして定義することができます。

クラスプロパティ定義

instanceProperty はインスタンスに属するプロパティで、classProperty はクラスに属するプロパティです。

instanceProperty は、MyClass のインスタンス毎に異なる値を保持することができますが、classProperty は、インスタンスがいくつ存在するかにかかわらず1つの値が共有されます。
ちなみに、インスタンス経由でなくとも、MyClass.classProperty としてアクセスすることもできますので、インスタンスが存在する必要もありません。

stored なクラスプロパティをオーバーライドする方法はない

いきなり、結論です。stored なクラスプロパティをオーバーライドする方法は、Swift では、用意されていません。

以下のように定義しても、コンパイラーからエラーが返されます。

stored なクラスプロパティ のオーバーラード

つまり、Swift 言語として、”stored property”な クラスプロパティを子クラスで上書きすることはできません。

stored でない computed プロパティ

stored property がダメならば、computed property にすれば良い という発想です。

実際に、Swift では computed な クラスプロパティならば上書きできます。

computed クラスプロパティの定義

クラスメソッドと同様に class という記述を先頭に付与することで、computed なクラスプロパティとして定義できます。

以下のようにすると computed なクラスプロパティとして “classProperty” を定義できます。

computed な クラスプロパティ定義

computed なクラスプロパティのオーバーライド

computed なクラスプロパティのオーバーライドは、以下のようになります。

やはりメソッドのオーバーライドと同様に override を付与して定義します。

computed なクラスプロパティのオーバーライド

まとめ:クラスプロパティのオーバーライド

クラスプロパティのオーバーライド
  • stored なクラスプロパティのオーバーライドはできない
  • computed なクラスプロパティのオーバーライドはできる

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です