色々できるぞクロージャー。

夜分遅くにこんばんは。

ズルズルと伸ばしてしまっていたのが気に入らず、なんとしてでも書き上げたかったのでこの時間になってしまいました。(読んでくださる方いるのかな?)

 

以前クロージャー、トレーニング編を書かせて頂きました。クロージャーはどんな書き方が成立するのか?という視点でひたすら試してみた回でした。

https://nnkamura.hateblo.jp/entry/2019/11/10/155424

 

今回はクロージャーで何ができるの?というお話です。今まで知らなかった記法の②、③が今回書きたくて始めましたので、①のざっくり感をお許しください🙃

 

①同期処理。一番使うやつ。

 

Aメソッド:APIにて必要な情報を取得

Bメソッド:取得した情報を画面に描画

という処理を行う際、Bメソッドが先に動いてしまうと求めている動作が行われません。必ずAメソッドが終わった後、Bメソッドを呼ぶ必要があります。

この時使うのがクロージャーです。

 

これのサンプルコードは…保留にしておきます。皆さんご存知ですよね。

 

②ViewControllerをキレイにするInitialization Closure

f:id:NNkamura_Enginieer:20191119024722p:plain

letのgoButtonに初期値を設定することができる

viewDidLoadに"goButton.frame = CGRect~~~"

とか書くのダサいなと思っていながらも、良い書き方が分からないそんな貴方にこの記法。

これをInitialization Closureというらしいです。IBOutlet(Storyboard接続)の物にはdidSetで同様の記法をすることが出来ます。

Storyboardでチマチマ設定することは出来ますが、こちらで書けば一目瞭然!オススメです。

 

③MVVMができる

あんまり設計パターンの話をすると火傷しそうな気もするのですが、勇気を出して。

 

MVVMとはView、ViewModel、Modelの層に分けて実装を行う設計パターンの形です。

僕のゆるーい解釈でいくと、ViewModelがModel(内部データ)とView(画面描画)の受け渡しをしていまして、Modelが変わったら即座にViewModel君がView君に反映させるっていう、そういう感じです。(ググろう!)

サンプルコードがこちらです。

f:id:NNkamura_Enginieer:20191119025156p:plain

MidViewController

f:id:NNkamura_Enginieer:20191119025231p:plain

MidVIewModel

 

①midViewController.viewDidLoadでmidViewModel.dataBindingを呼び出します。

②midViewModel.didChangeにmidViewController.updateTable処理を代入します。

③midViewController.viewDidLoadでmidViewModel.tableDataの値を変更します。

④midViewModel.tableDataの値が変わった時、didSetに記載しているdidChangeが動きます。

⑤didChangeにはmidViewController.updateTableが代入されている(②)ため、midViewController.updateTableが動きます。

⑥midViewController.updateTable処理にて、本来は画面のテーブルを再度描画します。

 

といった流れです。

tableData(Model)の値が変わったら即座にViewModel君がView君に反映させているわけですね。

 

正直なところこの書き方が良い書き方なのか、メジャーな書き方なのかは分かりかねるのですが、こういう方法があるのかと初めて見た時に唸ったので書かせて頂きました。設計パターンについてはまだまだ勉強途中なので、自分の中でまた更新があったら当ブログにて報告させていただきます。

 

 

あとがき

えーなんとか、クロージャー編終わりました。

技術ブログは苦しいです。自分の中の出来てなさを人に見せる部分が多く、当初目論んでいた(高い)技術力のアウトプット戦略とは真逆の行動でした。

それでも自分に必要なネタをちゃんとやっていきたいので仕方ない。

これからもダサダサ技術ブログをよろしくお願いします。ツッコミ大歓迎です。