Sponsor Link
目次
環境&対象
- macOS Big Sur 11.2.3
- Xcode 12.4
- iOS 14.4

クラスプロパティのオーバーライド
Swift では、struct が主役になっていますが、class を使う機会もまだ多くあります。
Class の stored property を子クラスでオーバーライドする方法は、よく紹介されていますが、
「クラスプロパティ をオーバーライドする方法」は、知らない人の方が多いのではないでしょうか?
あまり必要性も発生しないので、気にしていない人も多いと思いますが、その方法を説明します。
クラスプロパティ?
クラスプロパティは、クラスのインスタンスに属するプロパティではなく、クラス自体に付与されるプロパティです。
Swift では、クラス定義中に、static を付与して定義することで、クラスプロパティとして定義することができます。
1 2 3 4 5 6 |
class MyClass { static var classProperty: Int = 50 var instanceProperty: Int = 40 } |
instanceProperty は、MyClass のインスタンス毎に異なる値を保持することができますが、classProperty は、インスタンスがいくつ存在するかにかかわらず1つの値が共有されます。
ちなみに、インスタンス経由でなくとも、MyClass.classProperty としてアクセスすることもできますので、インスタンスが存在する必要もありません。
stored なクラスプロパティをオーバーライドする方法はない
いきなり、結論です。stored なクラスプロパティをオーバーライドする方法は、Swift では、用意されていません。
以下のように定義しても、コンパイラーからエラーが返されます。
1 2 3 4 5 6 7 8 |
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” を定義できます。
1 2 3 4 5 |
class A { class var classProperty:Int { return 50 } } |
computed なクラスプロパティのオーバーライド
computed なクラスプロパティのオーバーライドは、以下のようになります。
やはりメソッドのオーバーライドと同様に override を付与して定義します。
1 2 3 4 5 6 7 8 9 10 11 |
class A { class var classProperty:Int { return 50 } } class B: A { override class var classProperty: Int { return 75 } } print(B.classProperty) // -> 75 |
まとめ:クラスプロパティのオーバーライド
- stored なクラスプロパティのオーバーライドはできない
- computed なクラスプロパティのオーバーライドはできる
説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。
Sponsor Link