SlideShare una empresa de Scribd logo
1 de 53
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Narami Kiyokura
 
Visual C++ 2015の紹介(C++11/14的に)
Visual C++ 2015の紹介(C++11/14的に)Visual C++ 2015の紹介(C++11/14的に)
Visual C++ 2015の紹介(C++11/14的に)egtra
 
.NET Core と .NET Framework (続きは de:code 2016 で!)
.NET Core と .NET Framework (続きは de:code 2016 で!).NET Core と .NET Framework (続きは de:code 2016 で!)
.NET Core と .NET Framework (続きは de:code 2016 で!)Akira Inoue
 
Visual Studio Codeで始めるTypeScript
Visual Studio Codeで始めるTypeScriptVisual Studio Codeで始めるTypeScript
Visual Studio Codeで始めるTypeScriptAkira Inoue
 
20160308 私とVisual Studio
20160308 私とVisual Studio20160308 私とVisual Studio
20160308 私とVisual StudioTakayoshi Tanaka
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio CodeAkira Inoue
 
エクストリームC++11/14プログラミング
エクストリームC++11/14プログラミングエクストリームC++11/14プログラミング
エクストリームC++11/14プログラミングegtra
 

La actualidad más candente (7)

Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門
 
Visual C++ 2015の紹介(C++11/14的に)
Visual C++ 2015の紹介(C++11/14的に)Visual C++ 2015の紹介(C++11/14的に)
Visual C++ 2015の紹介(C++11/14的に)
 
.NET Core と .NET Framework (続きは de:code 2016 で!)
.NET Core と .NET Framework (続きは de:code 2016 で!).NET Core と .NET Framework (続きは de:code 2016 で!)
.NET Core と .NET Framework (続きは de:code 2016 で!)
 
Visual Studio Codeで始めるTypeScript
Visual Studio Codeで始めるTypeScriptVisual Studio Codeで始めるTypeScript
Visual Studio Codeで始めるTypeScript
 
20160308 私とVisual Studio
20160308 私とVisual Studio20160308 私とVisual Studio
20160308 私とVisual Studio
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio Code
 
エクストリームC++11/14プログラミング
エクストリームC++11/14プログラミングエクストリームC++11/14プログラミング
エクストリームC++11/14プログラミング
 

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

Nullabilityについて
NullabilityについてNullabilityについて
Nullabilityについてishikawa akira
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Tomoki Hasegawa
 
Microsoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 PresentationMicrosoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 PresentationYuichiro Saito
 
Objective-C/Swift コードの共用
Objective-C/Swift コードの共用Objective-C/Swift コードの共用
Objective-C/Swift コードの共用Yoichiro Sakurai
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby CocoaTomoki Maeda
 
React NativeでTwitterクライアントを作ってみよう
React NativeでTwitterクライアントを作ってみようReact NativeでTwitterクライアントを作ってみよう
React NativeでTwitterクライアントを作ってみようdcubeio
 
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -ShinichiAoyagi
 
既存Objective-CプロジェクトをSwiftに移行した時ハマったこと
既存Objective-CプロジェクトをSwiftに移行した時ハマったこと既存Objective-CプロジェクトをSwiftに移行した時ハマったこと
既存Objective-CプロジェクトをSwiftに移行した時ハマったことapuruni
 
Objective-C Generics LT version
Objective-C Generics LT versionObjective-C Generics LT version
Objective-C Generics LT versionGoichi Hirakawa
 
SwiftとCocoaPodsで始めるサクサクiOS開発!
SwiftとCocoaPodsで始めるサクサクiOS開発! SwiftとCocoaPodsで始めるサクサクiOS開発!
SwiftとCocoaPodsで始めるサクサクiOS開発! Koji Shiraishi
 
Node.js で Web アプリ開発
Node.js で Web アプリ開発Node.js で Web アプリ開発
Node.js で Web アプリ開発Tatsumi Naganuma
 
About SnapKit - Open source lab -
About SnapKit - Open source lab -About SnapKit - Open source lab -
About SnapKit - Open source lab -Daisuke Yamashita
 
XcodeのTargetについてのTIPS
XcodeのTargetについてのTIPSXcodeのTargetについてのTIPS
XcodeのTargetについてのTIPSYoichiro Sakurai
 
LightSwitch 結局何ができるの
LightSwitch 結局何ができるのLightSwitch 結局何ができるの
LightSwitch 結局何ができるのYoshitaka Seo
 
PHPカンファレンス関西 2011
PHPカンファレンス関西 2011PHPカンファレンス関西 2011
PHPカンファレンス関西 2011Takako Miyagawa
 
C#のやさしさを語る時間
C#のやさしさを語る時間C#のやさしさを語る時間
C#のやさしさを語る時間kamukiriri
 
T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門normalian
 
【第45回コンピュータビジョン勉強会@関東】NVIDIA VisionWorks Tips紹介
【第45回コンピュータビジョン勉強会@関東】NVIDIA VisionWorks Tips紹介【第45回コンピュータビジョン勉強会@関東】NVIDIA VisionWorks Tips紹介
【第45回コンピュータビジョン勉強会@関東】NVIDIA VisionWorks Tips紹介Yasuhiro Yoshimura
 
Salesforce Lightning をやってみてあれこれ
Salesforce Lightning をやってみてあれこれSalesforce Lightning をやってみてあれこれ
Salesforce Lightning をやってみてあれこれ寛 吉田
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーYoshifumi Kawai
 

Similar a SwiftでObjective-Cコードに立ち向かう (20)

Nullabilityについて
NullabilityについてNullabilityについて
Nullabilityについて
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法
 
Microsoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 PresentationMicrosoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 Presentation
 
Objective-C/Swift コードの共用
Objective-C/Swift コードの共用Objective-C/Swift コードの共用
Objective-C/Swift コードの共用
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa
 
React NativeでTwitterクライアントを作ってみよう
React NativeでTwitterクライアントを作ってみようReact NativeでTwitterクライアントを作ってみよう
React NativeでTwitterクライアントを作ってみよう
 
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
 
既存Objective-CプロジェクトをSwiftに移行した時ハマったこと
既存Objective-CプロジェクトをSwiftに移行した時ハマったこと既存Objective-CプロジェクトをSwiftに移行した時ハマったこと
既存Objective-CプロジェクトをSwiftに移行した時ハマったこと
 
Objective-C Generics LT version
Objective-C Generics LT versionObjective-C Generics LT version
Objective-C Generics LT version
 
SwiftとCocoaPodsで始めるサクサクiOS開発!
SwiftとCocoaPodsで始めるサクサクiOS開発! SwiftとCocoaPodsで始めるサクサクiOS開発!
SwiftとCocoaPodsで始めるサクサクiOS開発!
 
Node.js で Web アプリ開発
Node.js で Web アプリ開発Node.js で Web アプリ開発
Node.js で Web アプリ開発
 
About SnapKit - Open source lab -
About SnapKit - Open source lab -About SnapKit - Open source lab -
About SnapKit - Open source lab -
 
XcodeのTargetについてのTIPS
XcodeのTargetについてのTIPSXcodeのTargetについてのTIPS
XcodeのTargetについてのTIPS
 
LightSwitch 結局何ができるの
LightSwitch 結局何ができるのLightSwitch 結局何ができるの
LightSwitch 結局何ができるの
 
PHPカンファレンス関西 2011
PHPカンファレンス関西 2011PHPカンファレンス関西 2011
PHPカンファレンス関西 2011
 
C#のやさしさを語る時間
C#のやさしさを語る時間C#のやさしさを語る時間
C#のやさしさを語る時間
 
T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門T35 ASP.NET MVCを使ったTDD入門
T35 ASP.NET MVCを使ったTDD入門
 
【第45回コンピュータビジョン勉強会@関東】NVIDIA VisionWorks Tips紹介
【第45回コンピュータビジョン勉強会@関東】NVIDIA VisionWorks Tips紹介【第45回コンピュータビジョン勉強会@関東】NVIDIA VisionWorks Tips紹介
【第45回コンピュータビジョン勉強会@関東】NVIDIA VisionWorks Tips紹介
 
Salesforce Lightning をやってみてあれこれ
Salesforce Lightning をやってみてあれこれSalesforce Lightning をやってみてあれこれ
Salesforce Lightning をやってみてあれこれ
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
 

Último

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 

Último (9)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 

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