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

Swift

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

環境&対象

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

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

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

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

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

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

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

クラスプロパティ?

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

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

クラスプロパティ定義

class MyClass {
    static var classProperty: Int = 50
    var instanceProperty: Int = 40
}
instanceProperty はインスタンスに属するプロパティで、classProperty はクラスに属するプロパティです。

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

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

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

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

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

class A {
  static var classProperty: Int = 50
}
class B: A {
  static var classProperty: Int = 75  // Error: Cannot override with a stored property 'classProperty'
}

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

stored でない computed プロパティ

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

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

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

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

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

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

class A {
    class var classProperty:Int { return 50 }
}

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

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

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

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

class A {
    class var classProperty:Int { return 50 }
}

class B: A {
    override class var classProperty: Int  { return 75 }
}

print(B.classProperty) // -> 75

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

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

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

コメントを残す

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