親クラスの共通初期値設定をするアイデア

2020-02-24

こんちわ、しょーです。

コロナ怖いですね。
基本的に外出しないので、スーパーと出社が唯一の感染ルートだったんですが
とうとう弊社でも在宅業務が平準化とされました。
幸い自宅の作業環境はそこそこ整っているので良かった。

さて、プロパティの初期値を共通化する話をしよう。

アプリ上で、例えばUIViewUIButtonのプロパティを初期値として設定したいときってありませんか。
私はよくあります。
例えば、基本的に初期値は .isHidden = true しておきたいなぁとか、なんでもいいんです。

でもCustom Classならイニシャライザを作成して初期値設定できたりするんですが、親クラス全体に適用したいときってそうはいかないんですよね。
定義する場所もカスタムクラスならそこでいいんですが、親クラスとなるとどこにどのタイミングで設置しようか迷いますよね。

そんな時はこうしちゃおうという備忘録が以下です。

初期値設定

サンプルとして、UIButtonの同時タップを制御する実装を特定のボタンではなく、アプリ全体に反映したい場合。

同時タップ制御としては、以下のプロパティ設定をする事で制御可能です。

UIButton().isExclusivetouch = true

これをUIButtonの初期値としてデフォルトで設定したい場合

UIButton.appearance().isExclusivetouch = true

とするとアプリ全体に反映させることができます。

でもこういう場合って、設計上どこに記述するのがベストなんだろう、と思うわけです。

カスタムクラスの場合

カスタムクラスを使用している場合は上記のようにイニシャライザにでも記述しておけば問題ありません。

大体どのオブジェクトクラスもイニシャライザ内でプロパティ設定をしたりするかと思います。

親クラスの場合

親クラスの場合、新しいイニシャライザを生やすことも可能ですが、インスタンス作成する場合はそれを呼ぶ必要があるし、選択されないリスクなどもあります。
リスクヘッジするためにも、より確実性を担保したいです。

そのような場合はappDelegateを利用してしまおう。

うちではapplication(_:didFinishLaunchingWithOptions:) に初期設定したいプロパティをまとめたりしています。

Official : application(_:didFinishLaunchingWithOptions:)

他にもカラーだったりアプリ全体を通して初期値をオブジェクトに付与したい場合は、上記のようにapplication(_:didFinishLaunchingWithOptions:)に初期設定用メソッドを作ってしまうのが良さそうです。

ちなみに.appearance()は親クラスに初期プロパティを設定したい時に便利です。

まとめ

初期値を個別設定したい場合はオブジェクトごと、またはカスタムクラスごとに設定。
大元の親クラスにアプリ全体を通して初期値を設定したい場合は、appDelegateを活用しよう!

お疲れっした〜。