『プロトコル拡張を、それに準拠する将来の型で制約して、既定の実装を添えよう』という話を発端にした考察

このまとめは #yidev 22 勉強会の懇親会で @niwatako さん、@sinsoku_listy さん、@eduraaa さん、@es_kumagai の間で話題に上った話を受けて、自分が「プロトコル拡張の使い方に無理がないか?」という観点で考察を進めたものになります。 実装の方向性に対する4人の意見がちょうど2対2にわかれた印象で、方や理屈方面で模索する、片や実装方面で模索するみたいな、ペアディベート感が楽しかったです。
1
前へ 1 ・・ 4 5 次へ
熊谷 友宏 @es_kumagai

とりあえず、型で検証するとこんな感じ。文字列化すると情報が落ちるみたいで混乱しますけど、メタタイプかどうかまでを確認すると違いがはっきり見えてくるみたい。 gist.github.com/d54c8e696772bb… #swift pic.twitter.com/oBEM8MwZwB

2016-03-08 14:23:15
拡大
熊谷 友宏 @es_kumagai

つまり、こんな感じで Self と、静的メソッドにおける self.dynamicType とが一致するはず。… そろそろプロトコルで検証してみよう。 gist.github.com/077615ced690bd… #swift pic.twitter.com/3fexRx2OfY

2016-03-08 14:31:10
拡大
熊谷 友宏 @es_kumagai

まだ、既定の実装を隠蔽することについての検証はしてないですけど、とりあえず先ほどのコードをプロトコル版にしても(やや違えど)同じく動作しているみたい。 gist.github.com/a8f482b2624a7f… #swift pic.twitter.com/3B9AzMKxQm

2016-03-08 14:51:17
拡大
熊谷 友宏 @es_kumagai

あとはこんな性質か。プロトコル拡張内では Self.Type でも、そこにプロトコルに準拠した AdoptClass.Type が入っているかもしれない。 gist.github.com/8c5a095b817cdd… #swift pic.twitter.com/i0PKYvetcF

2016-03-08 15:02:03
拡大
熊谷 友宏 @es_kumagai

先ほどの例に書いたように .Type.Type についても同様なのと、.Type.Type を取りたいとき、SelfCheck.self の次は .dynamicType … か。 #swift

2016-03-08 15:05:17
熊谷 友宏 @es_kumagai

あれ、いちおう型のメタ情報とて dynamicType で取れているのか。 gist.github.com/1ca3a9dc4e0a9a… #swift pic.twitter.com/hKKhpgCwFQ

2016-03-08 15:06:04
拡大
熊谷 友宏 @es_kumagai

掌握した…? 頭が混乱していますけど、たぶんこれで Self と self.dynamicType で同じ動作になるのが説明できている、はず? gist.github.com/7d6de5261ff03f… #swift pic.twitter.com/9Wh6IBvsIW

2016-03-08 15:57:16
拡大
熊谷 友宏 @es_kumagai

ああ、まだでした。プロトコルに付属型をつけた時にたしか結果が変化するんでした。 #swift

2016-03-08 16:00:41
熊谷 友宏 @es_kumagai

ああ、やっぱりこれで良いのかもしれない。静的メソッドとインスタンスメソッドとで違いが出るはず!と思ったけれど出ず、でも勘違いできっとこれで正しそう。 gist.github.com/78852404b91850… #swift pic.twitter.com/Ebis0pM3m8

2016-03-08 16:15:15
拡大
熊谷 友宏 @es_kumagai

あれ、実行結果が変わらなかった …今件の元の問題は、付属型があるかどうかで動作が変わったはず…! gist.github.com/3cb1ea2abd198f… #swift pic.twitter.com/31hZNPCtNG

2016-03-08 16:22:00
拡大
熊谷 友宏 @es_kumagai

ああ、なるほど。最初の例は extension MyProtocol where Self : ClassA みたいな制約がつくのね。 #swift

2016-03-08 16:26:43
熊谷 友宏 @es_kumagai

そして今、完璧に掌握した😎 … ように思える。また新たな課題を見つけてくれそうですけれどね😉 gist.github.com/bbb87b8135c298… #swift pic.twitter.com/fy2o4anwam

2016-03-08 16:49:59
拡大
熊谷 友宏 @es_kumagai

そしてそんな調査の過程で「Swift 史上、最も自己主張の強いコード」を発見した 😏 gist.github.com/152aa27934a904… #swift pic.twitter.com/hrRZuSIhjr

2016-03-08 16:57:52
拡大
熊谷 友宏 @es_kumagai

またきっと混乱するのは別として、とりあえずプロトコル拡張の世界観を把握できたような気がする。 #swift

2016-03-08 17:08:01
熊谷 友宏 @es_kumagai

ああ、世界観までは言い過ぎか。とりあえず、動きのところね。 #swift

2016-03-08 17:08:41
熊谷 友宏 @es_kumagai

ああ、そうか、もうひとつ。いくら Type の dynamicType と言っても、実行時にしか得られない以上、それを扱うための変数の型はビルド時に何かに決めておかないといけない。だから Self.Type で固定されるのかな。 #swift

2016-03-08 18:24:07
熊谷 友宏 @es_kumagai

そしてこの Self.Type と型へ義務付けるか否かの2つで、もしかしてプロトコル拡張の呼び出し的な動きのほとんどを説明できてしまうかもしれない? #swift

2016-03-08 18:25:48
ezura @eduraaa

@es_kumagai なるほど。ありがとうございます! 混乱の元凶の print は型情報を深くまで見てくれるということでしょうか…。挙動としては納得できて安心なような、やっぱりよくわからないような。もう少し考えてみます!

2016-03-08 20:06:49
ezura @eduraaa

@mo_to_44 制限をつけたとき「この場合は"例外的"にこうするよ」とも見えて、果たして例外だけどデフォルトとは一体なんだろうと混乱しまして…。

2016-03-08 20:21:10
ezura @eduraaa

@mo_to_44 あ!これは、プロトコル側から考えてるからかもしれないです。型側から考えると疑いようもなくデフォルト実装な気もします!

2016-03-08 20:21:44
ezura @eduraaa

少し混乱したけれど、トリッキーな事態を除いて考えれば、デフォルト実装だと自信を持って言えそうです。 ありがとうございます!\\\\└('ω')」////

2016-03-08 20:43:41
ezura @eduraaa

最近、トリッキーなことを考えすぎて見失っていたけれど、rizumita さんのおっしゃっていた通り、protocol extension はやはりそのプロトコルの特性として捉えて良いんだ。

2016-03-08 20:59:02
熊谷 友宏 @es_kumagai

たまにはちょっと C++ で。Swift プロトコル拡張の動きを見てたら C++ のクラスの動き「隠蔽」と「オーバーライド」の差異を思い出した。 gist.github.com/908f93a41c5135… #swift #cpp pic.twitter.com/nvGPygUucN

2016-03-08 21:39:28
拡大
熊谷 友宏 @es_kumagai

プロトコル拡張の処理的な観点から。C++ でクラスを型で扱ったときと、Swift でプロトコル側から見たときの動きと。C++ でクラスをポインターで扱ったときと、Swift で型側から見たときの動きと。なんかとっても似ている気がした。 #swift

2016-03-08 21:41:59
前へ 1 ・・ 4 5 次へ