swiftでobjective-cコードに立ち向かう

53
SwiftでObjective-C コードに立ち向かう @toshi0383

Upload: toshihiro-suzuki

Post on 16-Aug-2015

1.007 views

Category:

Technology


2 download

TRANSCRIPT

SwiftでObjective-Cコードに立ち向かう

@toshi0383

今日話すこと• Objective-CとSwiftの互換開発入門(てきとう

• Advanced Objective-CとSwiftの互換開発

Objective-CにSwiftを混ぜるときに気をつけること

きほん

• 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 に飛んで、実装が見えない。

BridgingHeaderのファイル名にはターゲット名が使われる

自動生成してみると。。

Bridging Headerがたくさんできた。。

• うげ。

• ターゲット分できている。 • 一つずつ消してひとつにまとめて、解決

• もしくは、ターゲット一つにするとか

objcで書いた単体テストからSwiftクラスが見えない?

• これは、

• これが正しい。

• よくみるとちゃんと設定されていた。

objcで書いた単体テストからSwiftクラスが見えない?

• それだけではだめだった。

• public…。

• ※Swift2で@Testableを使えばpublicにしなくてよくなりました。

SwiftもXcodeももうちょっとがんばってほしい

objcからCommand + Clickで宣言部にジャンプすると、{Product}-Swift.h に飛んで、実装が見えない。

もうちょっとがんばってほしい

objc側で.hで#defineした定数、マクロが見えない?

Bridging-Headerでimportすれば#defineで定義した値も見えた

• ※会場で実演してくださった@akio0911 さんありがとうございます!

きほんのまとめ• ちゃんと設定すれば、シームレスな連携ができる

• {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を使用

とある要件

• SNSシェア機能を音楽詳細画面と動画詳細画面に追加する

• UIActivityViewControllerを使用

ベース詳細画面クラス

ここに共通実装を追加する?

とある要件

• SNSシェア機能を音楽詳細画面と動画詳細画面に追加する

• UIActivityViewControllerを使用

ベース詳細画面クラス

ここに共通実装を追加する?ダウンロード詳細画面

動画モデル音楽モデル

ベースクラスの問題点• いろんな処理が1箇所にまとまって混沌とする

• 継承するけどすべてのメソッドが使われるわけではない。=>影響範囲が読めない

• 微妙に実装を変える必要があるところは結局子クラスのファイルに書かれることになり、子クラスも混沌としてくる

そこで

Swift protocol extension

protocol extension• protocolに対してデフォルト実装を持たせられる

つまり

こうするとハッピーになれそう

• SNSシェア機能を音楽詳細画面と動画詳細画面に追加する

protocol SNSShareable

ここに共通実装を追加する

extension SNSShareable

理想はこんなかんじ?SNSShareable

PlaylistManagarableClippable

動画詳細VC 音楽詳細VC ダウンロードリストVC

TableEditable

ベースクラス実装と比べていいところ

• protocolを見ればなにをしているかわかる

• 後から別の画面にもSNSシェア機能を追加したい場合も、protocolに適用するだけで共通実装が得られる

Swiftつよい

あれ

• SNSシェア機能を音楽詳細画面と動画詳細画面に追加する

protocol SNSShareable

ここに共通実装を追加する

extension SNSShareable

• SNSシェア機能を音楽詳細画面と動画詳細画面に追加する

protocol SNSShareable

ここに共通実装を追加する

extension SNSShareable

Objective-CObjective-C

Objective-Cのクラスにprotocolって使えるんだっ

@objcをつければ

• 使えます。

Objective-Cのクラスにprotocol extensionって使

えるんだっけ

あ。。

使えませんでした

結果

こうなった

• 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 にできない

つまり

Swift使えないじゃん。。

絶賛交渉中 (ダメだったら来週Objective-C

で書き直すことになる)

最後モヤッとしますが、以上です。

Q&A