swift


jsとphpとas3の野良webエンジニアがswiftについて勉強しているよ!で、デリゲートというのがなんの事がチンプンだったので、ここ数日色々テキストを色々読みまわしていました。その結果「ん?こういう事?」というのが見えたので、メモエントリー。ひょっとして間違ってるかもしれませんが、多分こういうことじゃないかなぁ。てか以外と普通の事?じゃない?これ。

どこ読んでもだいたい「デリゲートとは委譲するという意味です」みたいなこと書いてますが、これがjsなんかの発想と相性が悪い感じがします。例えばhtml+jsの場合、発想の手順は「divで箱を作って、idで名前付けて、jsで操作する」みたいな感じだと思います。

この発想の場合、divはあくまで無機能の箱なので、jsに何かを委譲するとは考えません。委譲するまでもなく、そもそもjsに全ての操作が託されています。

これがFlash/as3になると、発想が少し変わります。発想の手順は「ムービークリップシンボル(クラス)を作って、ステージに配置(インスタンス化)して、メインのタイムラインで操作する」となります。as2の場合は、配置したインスタンスにシンボル名という固有のidで命名して操作してましたが、as3になるとこの方法は一般的ではなくなり、インスタンス化したものを配列に記録したものを呼び出して操作したりしてました。懐かしい。

この発想は基本的にはhtml+jsと同じなのですが、ムービークリップシンボル自体に機能を持たせた場合、メインのタイムラインからその機能を「呼び出す」事ができるようになります。ここら辺がオブジェクト指向とかのキモだったように思うのですがあってるかな^^; とにかく、こうやってパーツを「ブラックボックス化」する事で、メインのタイムラインのソースコードがスッキリしたり、部品ごとの挙動が明快になったり、集団作業がしやすくなったりというメリットがありました。

違ったら恥ずかしいのですが、この「ブラックボックス化されているパーツを、メインのソースコードで操作する」という行為を、swiftでは「デリゲートを使って操作する」みたいに言っているように思います。flashの作業フローにデリゲートという言葉を無理やりねじ込んでみると、「インスタンスはデリゲートを使ってメインのタイムラインのソースコードで操作します」という言い方になるのかと思います。

js,as使いにとってデリゲートという言葉が難しいのは、今まで当たり前のように行っていた行為に名前がついちゃったため、なんかすごい事なのか?と思っちゃうせいじゃないかなーと思います。

もう一度Flashに戻って。Flashでは、as2まで「タイムラインアニメーションのパッケージ主体だったムービークリップ」が、as3で「コード主体のクラス」となった時に、ちょっとした発想の変換が必要でした。ステージに配置してただけの作業が「インスタンス化してステージの表示リストに追加する」みたいな言い方になったり。こういった経緯を踏まえると、as3の「インスタンス化したクラスの機能をメインのタイムラインから呼び出す」という作業の流れはむしろ自然だったため、その行為自体にデリゲートという名前がつく事は無かったのだと思います。

swiftでデリゲートという言葉が重要な意味を持つのは、swiftはflashでいう「コンポーネント」主体で設計されている言語だからなんだと思います。僕はflashではコンポーネントほとんど利用しなかったのですが、それは僕が行ったflash案件が「デザイナーさんが作ったグラフィカルなUIにアクションを追加する」という作業だったためで、これはflashエンジニアの多くが理解できるところだと思います。flash使ってた頃の僕にとってコンポーネントとは、「標準装備されてる便利なクラス(=便利だけどダサいからほとんど使うことはないムービークリップ)」みたいな認識でした。

しかしswiftに求められるのは多くの場合、「iPhoneらしいUIにサービスを落とし込む」作業で、必然的にiOS標準のUIパーツを使うことが多くなるため、コンポーネント(swiftではオブジェクトライブラリに表示されるパーツ)の出番が多くなります。そういった時に、「パーツそのものが複雑な機能を処理してて、勝手にいじられたらiPhoneぽいユーザー体験が得られなくなっちゃうから、ステージに配置したパーツそのものに個別の処理は書かないでね!viewControllerにデリゲートして、個別のことはそっちでやってね!」というメッセージを込めて、デリゲートという行為が重要視されているのだと思います。

ということで、ここまでの憶測があってるかはまだ不明なのですが、とりあえずこういう認識で勉強を進めようと思います。デリゲートにビビらない!outletはインスタンス!程度のノリで頑張ります。

16/2/3 8:50 追記
「ブラックボックス化されているパーツを、メインのソースコードで操作する」という行為は、どちらかというとoutlet/actionに関しての解釈に近いような気がしてきました。デリゲートはさらに積極的にブラックボックスを扱いたい時(FlashでいうdispatchEventしたい時に近いタイミング?)に必要になるものやもしれません。引き続き勉強します。

9:03 追記
outlet→インスタンス化
action→個別の処理(ボタン押したらXXXにジャンプする的な処理)
delegate→コンポーネントが発行するイベントを受け取るために必要な手続き(dispatchEvent的な...?)
こうか?