Daniel Eggertさん「モダンCoraData」
objc.
以下の方法で置き換えていきました。
- 1. Insert New Object
従来だとエンティティ名をStringで指定していたので型安全ではありませんでした。まずProtocol Extensionでエンティティ名を切り出しました。インサート処理の際に切り出したメソッド名を呼ぶようにすることでコンパイルでチェックできるようになります。
- 2. Key Value Coding
従来の方法だとキーの値をタイプミスしやすく型安全ではありませんでした。型制約付きのProtocol Extensionを利用し,
キーの値にEnumを用いることで, 型安全に指定できるように改善できました。 - 3. Fetch Request
Fetch RequestはSortDescriptorをProtocolに切り出し,
Protocol ExtensionでSortDescriptor処理を実装することでシンプルに改善できました。Predicateを使用する場合も同様です。 - 4. ValueTransformer
Protocol ExtensionにA→Bの変換,
B→Aの逆変換をそれぞれ実装し, typealiasで宣言しておくことで様々な型に適用できるようにしました。 - 5. NSNotification
ClosureでDelete,
Updateなどを処理できるように修正しました。NSManagedObjectContextにProtocol Extensionで通知を確認し, Closureで返すヘルパーを実装し, DidChangeNotificationをラップすることでシンプルな書き方に改善していました。
既存APIのスピリットを尊重する
上記のようにProtocolとProtocol Extensionを駆使して既存APIをベースにSwiftコードに置き換えていました。これにより,
Novall Khanさん「SwiftコンパイラとLLDBの連携」
SplitwiseでiOSエンジニアをされているNovall Khanさん
LLDBについて
LLDBのデバッグコマンドを知ることで,
LLDBはObjective-Cの場合はClang,
Swiftのエラーハンドリング
LLDBはSwiftのエラーハンドリングに対応しており,
また,
CustomStringConvertible
また,
Jeff Huiさん「ライブラリの開発」
RSpecライクなSwiftのテストライブラリのQuick/
テスト(CI)について
一定のレベルを保証したいのでテストは必ず組み込むようにしているそうです。テスト
実際にライブラリを例に作業手順を説明しました。
パッケージマネージャへの対応
その際,
- CocoaPods
- 依存性のあるライブラリを含めて自動でライブラリ化してくれる
- PodSpecファイルの作成が必要
- Carthage
- プロジェクトに直接インクルードする場合
- Cartファイルの設定が必要
- Swift Package Manager
- 唯一Linuxでの配布サポート
- 対応作業が他の2つのパッケージマネージャより多い
Swift Package Managerの注意点として,
リリースの際のバージョニング
セマンティックバージョンの付け方についても言及がありました。詳しくはsemver.