寄付窓口はこちら

try! Swift プロトコルと約束の地 #tryswiftconf Day1-7

(十分に書き取れていない!申し訳ない!!)

twitter.com

Swiftの設計はジェネリクスや第一級プロトコルなど言語の機能がアプリケーション開発のカギとなることを推進しています。しかし、Objective-Cから導入されたものを含む論理的パターンの多くは期待した通りには動作しません。多くの場合、Swiftの型システムは、プロパティをクラスとプロトコルの両方に拘束したりする素直なパターンとうまく動きません。この講演ではいくつかの課題に着目し、内部に潜む原因を議論し、対応策について考えます。

f:id:niwatako:20160302150018j:plain f:id:niwatako:20160302150023j:plain Swiftはまだまだ新しいものです。20年あったObjective-Cと比べれば若いものです。同じように扱おうと思っても全く違うものになります。

SwiftObjective-Cと相性が良いといいましたが違いがあります。

asということば、いろいろなところに出てきます。橋渡しでチェックをする要求が出てきます。

f:id:niwatako:20160302150127j:plain f:id:niwatako:20160302150209j:plain as がウソを付くこともあります。CoreDataでやられました。Objective-C側からSwiftにブリッジする時機能しないのです。

f:id:niwatako:20160302150216j:plain

そこで.map する必要があります

f:id:niwatako:20160302150233j:plain

そして突然コンパイラエラーが出てきてObjective-Cでなければダメだというのが出てくる。 f:id:niwatako:20160302150302j:plain f:id:niwatako:20160302150312j:plain

@objc があちこちで出てきてSwiftの機能が使えなくなっていきます。

SwiftからObjective-CにしてSwiftに戻したいことがありますが、出来ること出来ないことがあります。 f:id:niwatako:20160302150406j:plain f:id:niwatako:20160302150418j:plain

ブリッジングはコンパイラレベルで行われます。シンプルなユースケースであればよいのですが、もっと先進的なSwift機能を使うと落とし穴がある。

enum や struct が利用できるのは限定的、Objective-Cの問題にぶつかる。

Objective-CからSwiftに移行させるのであればほんとうによく考えて効果があるか考える必要がある。

フレームワークはブリッジングヘッダに残っているとコンパイラエラーが発生します。 f:id:niwatako:20160302150626j:plain

Objective-Cクラスを使う時自動で生成されるヘッダにそれがない場合は問題になる f:id:niwatako:20160302150652j:plain


ViewControllerをプロトコルに準拠させていきました f:id:niwatako:20160302150756j:plain

プロトコルコンポジションというものです。 f:id:niwatako:20160302150821j:plain

UIKit が変わらないという問題を抱えています。ViewControllerのProtocolがヘッダファイルに入っていない。

コンピューテッドプロパティを使う方法。これは強力。 f:id:niwatako:20160302150957j:plain

f:id:niwatako:20160302151047j:plain

f:id:niwatako:20160302151138j:plain

Swiftプロトコル言語。Swiftはオブジェクトをいろんなプロトコルで記述しています。

f:id:niwatako:20160302151231j:plain

プロトコルエクステンションにはSuperというものがない。SwiftのクラスはSwift上でしかテストが出来ません。

プロトコルのパワーに加えてGenericsをサポートしています。

Genericsを使い始めて最初の課題はGeneric Protocolは宣言できない。 f:id:niwatako:20160302151356j:plain

アイテムが有るということだけわかっています。 f:id:niwatako:20160302151419j:plain これは出来ません f:id:niwatako:20160302151433j:plain

共分散 f:id:niwatako:20160302151453j:plain GenericsとTypealiasの区別がつかない。 f:id:niwatako:20160302151520j:plain

継承すると具体クラスになってしまう。 f:id:niwatako:20160302151559j:plain

Genericsは一つのレベルだけ。

ネストはどうでしょう

f:id:niwatako:20160302151629j:plain

トップレベルでないとだめです。

Generic クラスのテストを作る時NSObjectsでないものは上手くいかない。

Swiftは新しい素晴らしいパターンを提供してくれていますがやりたいことを殺るにはまだ色いろある。リミットが有ることを理解する必要がある。 このアドベンチャーに入っていくということを分かって進めてください。

f:id:niwatako:20160302151807j:plain

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

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

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