2016Tweettwitter.com型を明確にすることがSwiftらしいやり方であると気づいた時、同時に時には型を消す必要があると分かります。この講演では、型とは何か、型を消すことが何を意味するか、なぜそうしたいかについて解説します。型消去の話をします怖い?どういうこと?型とは何?最高の定義はWikipediaで見つかりました。型とは、分類であり、値の集合とその値に対する有効な演算を定義するものであるということですね。Swiftコンパイラにとってこれらは便利な考え方です。StringにIntを入れることは有効ではないわけです。すべての型が平等なのではなく、コンパイラがチェック出来ない型が有ります。ここで具象型と抽象型を考えます。具象型はダイレクトにインスタンス化でき、明確なデータを持っていて、オブジェクト間でやりとしして情報共有がなされます。抽象型は不完全な実装になります。ダイレクトにインスタンス化出来なくて、振る舞いを表すものになります。抽象型がオブジェクトを表す時、格納される値よりも挙動が重要になります。使って定義したものがあります。SwiftはTがなにか、Uがなにかわかっていません。いう時にどうしたらいいのか。抽象型をどうやったら具象化出来るのか。いうのが役に立ちます。抽象型をプレースホルダに入れていくということです。皆さん使っているTypeParamater(型パラメータ)です。StringやIntがパラメータに渡されてインスタンス化されます。Protocolではこれが使えません。ここにポケモンというものがあります。ポケモンは小さなモンスターです。ポケモンの間にバトルを実装したいのですがエラーが出ますSwiftコンパイラに対して、実装がなにか分からないが絶対具象化されるということを伝える必要があります。それをどうコンパイラに伝えるか。次のようにAnyPokemonを作りますこのラッパークラスを使えばこのようなコードが書けます。型情報を消してしまいました型消去という名前が混乱のものです。これはソリューションではなく副作用です。あとこういう宣言が出来ません。Swiftはコードの共変性(より特殊な型をより一般的な型の代替にすること)に対応していません。型とはなんぞやという話をしました皆さんが独自に型を定義できる型の定義は頭に浮かびますか?具象と抽象がある型消去の話をしましたQAプロトコルがタイプと連携されている、扱いにくかったものでしたね。ほかに型消去の例はありますか?プロトコル上のGenericタイプの例でしたがGenericTypeが必要ない時でもファンクションがreturnした時に必要ないことがあります。Swiftコンパイラは推論しようとする。その制限を回避するために型消去を消す人もいる。型というわけではないがExtensionのソリューションはありますか?ないAppleが型消去のスタンダードライブラリに何を使っていますか?(AnyClass?)ここまでの事例以外でプロジェクトやビジネス上の理由で問題を解決しようとしたんでしょうか本番環境で型消去を、同僚が遭遇してEraseSwiftというライブラリを持っていて、FacebookのFluxパターンを追っています。行のデータフローがあってSubscriberがレシーブする、そこで型消去を使っていた。Subscriberが何でも受け取れるようにする、そういうところで型消去を使っていました。リストの話をしていましたね。新しいSwiftで反変性と共変性について書かれている?タイムラインはっきりしたことは分からない。型消去はかなり限定されたものになっていくと思いますが。Javascriptから来ました。私は型のない言語です。学んだらいいですか?(会場笑)まずはSwiftを書いてください。(会場笑)もっとありますよ?コンパイラで何かをした時にいつも怒られます。いうところでいろいろ試行錯誤になる。最終的には型安全なコードが書けるようになったんだ、と3ヶ月で自信が持てるのではないでしょうか。Swiftプログラマですが私は型が好きです。型消去についてもう一度、一言でまとめるとを聞かせてほしい。型消去の定義をもう一度まとめてということですね?トークをまとめるには非常に苦労しました。4つ定義がありました。話す度にそれじゃ違うよと言われ続けました。ベストな定義は、型消去はデザインパターンであるということですね。ラッパーで、イニシャライザに制約があるプロトコルの実装で具体化しようとしているプロトコルの時のみに使うということです。良い定義があったらぜひ聞きたいです。このボイラープレートコードは、もっと長いものがあります。1行ずつ呼んでいかないとわからない、2週間ぐらいかかりました。なんでこんなことするんだと思いました。最終的に、分かった、もっと協力なプログラマになれたと思うまでに苦労が必要だと思います。型消去は、RealmとHimotokiをつなぎこむ汎用functionを作る時に使えそう、かな?Decodableのインスタンスの型をもとにRealm.Objectの型を決める時にprotocolのtypealias増やさなくてよさそう。2016まとめを更新しました。メルカリで働くiOSエンジニアです。はてなブログPro大学時代に耳が聞こえない生徒が講義に参加できるようにリアルタイムに文字起こしするバイトをしていました。いまはエンジニアとして働きつつ、勉強会やカンファレンスで話される技術分野の知見を文章に残し、検索可能にしたり、地方で活動する方に届けたいと思っています。お役に立ちましたら、支援いただけると幸いです。(24)注目記事はてなブログをはじめよう!niwatakoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。