読者です 読者をやめる 読者になる 読者になる

try! Swift 書き起こし 平常心で型を消し去る #tryswiftconf Day1-5

try! Swift 2016

https://twitter.com/purpleyay

型を明確にすることがSwiftらしいやり方であると気づいた時、同時に時には型を消す必要があると分かります。この講演では、型とは何か、型を消すことが何を意味するか、なぜそうしたいかについて解説します。

型消去の話をします

  • 怖い?
  • どういうこと?
  • 型とは何?

f:id:niwatako:20160302123212j:plain f:id:niwatako:20160302123218j:plain

最高の定義はWikipediaで見つかりました。分類であり、値の集合とその値に対する有効な演算を定義するものであるということですね。

Swiftコンパイラにとってこれらは便利な考え方です。 f:id:niwatako:20160302123313j:plain

StringにIntを入れることは有効ではないわけです。しかしすべての型が平等なのではなく、コンパイラがチェック出来ない方が有る。

具象型と抽象型を考えます。具象型はダイレクトにインスタンス化でき、明確なデータを持っていて、オブジェクト間でやりとしして情報共有がなされます。

抽象型は不完全な実装になります。ダイレクトにインスタンス化出来なくて、振る舞いを合わラス物になります。オブジェクトを表す時、格納される値よりも挙動が重要になります。GenericでTypeTとUで定義したものがあります。

f:id:niwatako:20160302123508j:plain

SwiftではTがなにか、Uがなにかわかっていません。こういう時にどうしたらいいのか。抽象型を動やったら具象化出来るのか。Type reification というのが役に立ちます。抽象型をプレースホルダに入れていくということです。皆さん使っているTypeParamaterです。

f:id:niwatako:20160302123607j:plain f:id:niwatako:20160302123613j:plain f:id:niwatako:20160302123618j:plain

パラメータが渡されてインスタンス化されます。Protocolではこれが使えません。

ポケモンというものがあります。ポケモンは小さなモンスターです。

f:id:niwatako:20160302123714j:plain

ポケモンの間にバトルを実装したいがエラーが出る

f:id:niwatako:20160302123808j:plain

f:id:niwatako:20160302123834j:plain

Swiftコンパイラに対して実装がなにか分からないが絶対具象化されるということをいう必要があります。それをどうコンパイラに伝えるか。AnyPokemonを作る

f:id:niwatako:20160302123918j:plain

このラッパークラスを使えばこのようなコードが書けます。

f:id:niwatako:20160302123943j:plain

しかし型情報を消してしまいました f:id:niwatako:20160302124043j:plain

f:id:niwatako:20160302124109j:plain

型消去が名前の混乱のものです。これはソリューションではなく副作用です。

f:id:niwatako:20160302124141j:plain

あとこういう宣言が出来ません。 f:id:niwatako:20160302124227j:plain Swiftはコードの共変性に対応していません。 f:id:niwatako:20160302124243j:plain

f:id:niwatako:20160302124301j:plain

f:id:niwatako:20160302124448j:plain

  • 型とはなんぞやという話をしました
    • 皆さんが独自に型を定義できる
    • 型の定義は頭に浮かびますか?
  • 具象と抽象がある
  • 型消去の話をしました

QA

プロトコルがタイプと連携されている、扱いにくかったものでしたね。ほかに型消去の例はありますか?

プロトコル上のGenericタイプの例でしたがGenericTypeが必要ない時でもファンクションがreturnした時に必要ないことがあります。しかしSwiftコンパイラは推論しようとする。その制限を回避するために型消去を消す人もいる。

型というわけではないがExtensionのソリューションはありますか?

ない

Appleが型消去のスタンダードライブラリに何を使っていますか?

(AnyClass?)

ここまでの事例以外でプロジェクトやビジネス上の理由で問題を解決しようとしたんでしょうか

本番環境で型消去を、同僚が遭遇してEraseSwiftというライブラリを持っていて、FacebookのFluxパターンを追っています。一方行のデータフローがあってSubscriberがレシーブする、そこで型消去を使っていた。Subscriberが何でも受け取れるようにする、そういうところで型消去を使っていました。

リストの話をしていましたね。新しいSwiftで半編成と共変性について書かれている?

タイムラインはっきりしたことは分からない。型消去はかなり限定されたものになっていくと思いますが。

Ruby, Javascriptから来ました。私は型のない言語です。型嫌いです。どう学んだらいいですか?

(会場笑)

まずはSwiftを書いてください。

(会場笑)

もっとありますよ?コンパイラで何かをした時にいつも怒られます。そういうところでいろいろ試行錯誤になる。最終的には型安全なコードが書けるようになったんだ、と3ヶ月で自信が持てるのではないでしょうか。

Swiftプログラマですが私は型が好きです。型消去についてもう一度、一言でまとめるとを聞かせてほしい。

型消去の定義をもう一度まとめてということですね?トークをまとめるには非常に苦労しました。4つ定義がありました。話す度にそれじゃ違うよと言われ続けました。ベストな定義は、型消去はデザインパターンであるということですね。ラッパーで、イニシャライザに制約があるプロトコルの実装で具体化しようとしているプロトコルの時のみに使うということです。 もっと良い定義があったらぜひ聞きたいです。

f:id:niwatako:20160302125455j:plain

このボイラープレートコードは、もっと長いものがあります。1行ずつ呼んでいかないとわからない、2週間ぐらいかかりました。なんでこんなことするんだと思いました。始めたことを後悔。最終的に、分かった、もっと協力なプログラマになれたと思うまでに苦労が必要だと思います。

気に入った記事は はてなブックマーク

はてなブックマークアプリiOS開発チームから来ました! はてなブックマークにはSwift特集があります! 良い記事を見逃さないように、ご利用ください! http://b.hatena.ne.jp/hotentry/it/Swift

そして良いまとめ記事があったらはてなブックマークでブックマークしましょう! try! Swift の記事で盛り上がると嬉しいです!