swiftでobjective-cコードに立ち向かう
TRANSCRIPT
きほん
• https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
ハマったこと• Bridging Headerがたくさんできた。。
• objcで書いた単体テストからSwiftクラスが見えない?
• objc側で.hで#defineした定数、マクロが見えない?
• objcからCommand + Clickで宣言部にジャンプすると、{Product}-Swift.h に飛んで、実装が見えない。
きほんのまとめ• ちゃんと設定すれば、シームレスな連携ができる
• {Module}-Swift.hは自動生成です。
• テストケースはテストするクラスと同じ言語で書いた方がラク。
• Appleもうちょっとがんばってほしい
参考• Using Swift with Cocoa and Objective-C https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
• Swift and Objective-C Interoperability https://developer.apple.com/videos/wwdc/2015/?id=401
• Objective-CプロジェクトにSwift mix してハマったこと(随時更新) http://qiita.com/toshi0383/items/063205e0d188e9ef6e1d
とある要件
• SNSシェア機能を音楽詳細画面と動画詳細画面に追加する
• UIActivityViewControllerを使用
ベース詳細画面クラス
ここに共通実装を追加する?ダウンロード詳細画面
動画モデル音楽モデル
ベースクラスの問題点• いろんな処理が1箇所にまとまって混沌とする
• 継承するけどすべてのメソッドが使われるわけではない。=>影響範囲が読めない
• 微妙に実装を変える必要があるところは結局子クラスのファイルに書かれることになり、子クラスも混沌としてくる
こうするとハッピーになれそう
• SNSシェア機能を音楽詳細画面と動画詳細画面に追加する
protocol SNSShareable
ここに共通実装を追加する
extension SNSShareable
• SNSシェア機能を音楽詳細画面と動画詳細画面に追加する
protocol SNSShareable
ここに共通実装を追加する
extension SNSShareable
Objective-CObjective-C
こうなった
• SNSシェア機能を音楽詳細画面と動画詳細画面に追加する
protocol SNSShareable
ここにそれぞれ共通実装を追加
extension 音楽詳細画面extension 動画詳細画面
これが限界かな。。
実際の構成
• SNS機能.swift を作成
• その中にprotocolとextensionを両方まとめて定義。
• 処理をまとめたいときは、private なfree functionを作ることで対応
まとめ• Obj-Cと互換すると、Swiftの良さは生かし切れない
• いっそ全部書き換えちゃったほうが幸せかも
• 書き換えなくても、extensionで拡張する方法だとSwiftを味見できるという点ではよい
• 機能ごとにprotocolとその実装を同じファイルにまとめると、その機能の見通しが良かった
現在の納品手順開発用.xcodeproj
StaticLibrary作成用.xcodeproj
納品用.xcodeproj
ソースコードコピー
リソースコピー
ビルド
StaticLibrary.aコピー
zipに固めて
納品
現在の納品手順開発用.xcodeproj
StaticLibrary作成用.xcodeproj
納品用.xcodeproj
ソースコードコピー
リソースコピー
ビルド
StaticLibrary.aコピー
zipに固めて
納品 Swiftは .a にできない