Extensionで変数(Stored Property)を定義する方法


Swiftの基本のルールですが、Extensionで
・Method (メソッド、即ちファンクション)
・Computed Properties(計算型変数)
は定義できまるのに対して、
・Stored Property(保持型変数)
は定義することができません。

保持型変数と計算型変数の違いを簡単に説明しますと、保持型プロパティとは、データを保持してくれる、とても一般的な変数です。
計算型プロパティとは、すでに定義されている保持型プロパティを操る、getとsetのある、ファンクションに近い変数です。新たなデータを保持することはできません。

つまり、普通の保持型変数をクラスに追加したい場合、Extensionでではなく、クラスの中で定義しなければなりません。

けれども、Appleのライブラリのクラス(UIViewなど)のコードはアクセスできないため、そのようなクラスに新たな変数を定義することはできません。

もちろん、こういうようなクラスにサブクラスを作って、変数をサブクラスで定義できますので、問題はありません。
例えば、UIView の背景色が何回変わったかを記録する変数を付け加えようと思ったら、ColorChangingUIViewというSubclassを作って、そのクラスに変数を入れたら、解決されます。

SubclassでUIViewに変数を加える方法

 
上記の例では、単純に3つのColorChangingUIViewを作りましたので、問題はありませんでしたが、同じように、背景色が何回変わったかを記録する変数を持つUITableViewやUIButtonやUILabelなどを用意しようと思ったら、それぞれ、ColorChangingUITableView、ColorChangingUIButton、ColorChangingUILabelをつくる必要があります。
 
なお、同じ変数名を定義しても、ColorChangingUIViewとColorChangingUITableViewとColorChangingUILabelなどをループで取り扱う際、if is でそれぞれのタイプを確認しないと、colorChangesの変数がアクセスできないため、コードは複雑になり、大混乱になりやすい状態です。
 
それぞれのUIViewのSubclassにSubclassを作る場合のカオス

やっぱり、全てのクラスが親クラスとして共有しているUIViewのコードに変数入れることができたら、解決されますね。
それで、以下は、UIViewに保持型変数を入れる方法となります。

UIViewに保持型変数を入れる場合

わかりやすい上、重複を防げた簡潔なコードになりましたね。
これからも、Swiftの開発、頑張りましょう!

Related Post