Suche senden
Hochladen
Swift3とObjective-Cのブリッジでハマったこと
•
1 gefällt mir
•
1,586 views
庸介 高橋
Folgen
集まれSwift好き!Swift愛好会 Vol12の内容です。
Weniger lesen
Mehr lesen
Ingenieurwesen
Melden
Teilen
Melden
Teilen
1 von 16
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
yidev 第18回勉強会 「業務でSwiftで3ヶ月開発してきたので一旦振り返り」
yidev 第18回勉強会 「業務でSwiftで3ヶ月開発してきたので一旦振り返り」
佐藤 俊太郎
Swift 3.0 の新しい機能(のうちの9つ)
Swift 3.0 の新しい機能(のうちの9つ)
Tomohiro Kumagai
成長する組織を支えるシロクの自動化
成長する組織を支えるシロクの自動化
Naoyuki Kataoka
How to handle bitcode
How to handle bitcode
Syo Ikeda
シロク流事業の立ち上げ方の成功と失敗
シロク流事業の立ち上げ方の成功と失敗
Naoyuki Kataoka
Androidとi beacon(ble)
Androidとi beacon(ble)
Ikunori Yamaguchi
Xp祭り2014 agile2014参加報告(パターンネットワーク分析を含む)
Xp祭り2014 agile2014参加報告(パターンネットワーク分析を含む)
Hironori Washizaki
はじめてのiOSアプリ開発 ①
はじめてのiOSアプリ開発 ①
Nagamine Hiromasa
Weitere ähnliche Inhalte
Andere mochten auch
AKIBA.swift vol.1
AKIBA.swift vol.1
cocominap
モダンな開発現場になるためのお作法としてのツール活用
モダンな開発現場になるためのお作法としてのツール活用
智治 長沢
プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__
Tomohiro Kumagai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Tomohiro Kumagai
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
Tsuyoshi Watanabe
多人数iOSアプリ開発を考える
多人数iOSアプリ開発を考える
sasaron 397
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
Kanako Kobayashi
ナレッジを共有する文化をつくるために
ナレッジを共有する文化をつくるために
Recruit Lifestyle Co., Ltd.
チケット駆動で加速する顧客と協業するプロジェクトマネジメント
チケット駆動で加速する顧客と協業するプロジェクトマネジメント
グロースエクスパートナーズ株式会社/Growth xPartners Incorporated.
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
keroyonn
Swiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考える
Takuya Kitamura
Swift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDC
Tomohiro Kumagai
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
Tomohiro Kumagai
Androidアプリケーション開発入門
Androidアプリケーション開発入門
OESF Education
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
Masaki Hayashi
Carthageについて知りたいn個のこと
Carthageについて知りたいn個のこと
Syo Ikeda
Android概要資料
Android概要資料
サイバーエージェント
Sketchで変わるワークフロー
Sketchで変わるワークフロー
Asami Yamamoto
Andere mochten auch
(18)
AKIBA.swift vol.1
AKIBA.swift vol.1
モダンな開発現場になるためのお作法としてのツール活用
モダンな開発現場になるためのお作法としてのツール活用
プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
多人数iOSアプリ開発を考える
多人数iOSアプリ開発を考える
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
ナレッジを共有する文化をつくるために
ナレッジを共有する文化をつくるために
チケット駆動で加速する顧客と協業するプロジェクトマネジメント
チケット駆動で加速する顧客と協業するプロジェクトマネジメント
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
Swiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考える
Swift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDC
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
Androidアプリケーション開発入門
Androidアプリケーション開発入門
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
Carthageについて知りたいn個のこと
Carthageについて知りたいn個のこと
Android概要資料
Android概要資料
Sketchで変わるワークフロー
Sketchで変わるワークフロー
Mehr von 庸介 高橋
Cookpad TechConf 2019 - Build Chat with Firestore
Cookpad TechConf 2019 - Build Chat with Firestore
庸介 高橋
最新技術に挑戦し続ける LIFULL HOME'Sアプリの開発について
最新技術に挑戦し続ける LIFULL HOME'Sアプリの開発について
庸介 高橋
【ヒカラボ 2018/02/01】iOS LIFULL HOME'Sアプリリニューアルの裏側
【ヒカラボ 2018/02/01】iOS LIFULL HOME'Sアプリリニューアルの裏側
庸介 高橋
LIFULL HOME'S Firebaseによる特集配信
LIFULL HOME'S Firebaseによる特集配信
庸介 高橋
tvOS開発前に確認すべきこと
tvOS開発前に確認すべきこと
庸介 高橋
Jenkins + Deploygateを使った簡単ベータ配信
Jenkins + Deploygateを使った簡単ベータ配信
庸介 高橋
家族の「ただいま」を教えてくれるキーホルダー NFC版
家族の「ただいま」を教えてくれるキーホルダー NFC版
庸介 高橋
おうちハック発表会 #5 家族の「ただいま」を教えてくれるキーホルダー
おうちハック発表会 #5 家族の「ただいま」を教えてくれるキーホルダー
庸介 高橋
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
庸介 高橋
カラオケ曲管理アプリを作りました
カラオケ曲管理アプリを作りました
庸介 高橋
Mehr von 庸介 高橋
(10)
Cookpad TechConf 2019 - Build Chat with Firestore
Cookpad TechConf 2019 - Build Chat with Firestore
最新技術に挑戦し続ける LIFULL HOME'Sアプリの開発について
最新技術に挑戦し続ける LIFULL HOME'Sアプリの開発について
【ヒカラボ 2018/02/01】iOS LIFULL HOME'Sアプリリニューアルの裏側
【ヒカラボ 2018/02/01】iOS LIFULL HOME'Sアプリリニューアルの裏側
LIFULL HOME'S Firebaseによる特集配信
LIFULL HOME'S Firebaseによる特集配信
tvOS開発前に確認すべきこと
tvOS開発前に確認すべきこと
Jenkins + Deploygateを使った簡単ベータ配信
Jenkins + Deploygateを使った簡単ベータ配信
家族の「ただいま」を教えてくれるキーホルダー NFC版
家族の「ただいま」を教えてくれるキーホルダー NFC版
おうちハック発表会 #5 家族の「ただいま」を教えてくれるキーホルダー
おうちハック発表会 #5 家族の「ただいま」を教えてくれるキーホルダー
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
カラオケ曲管理アプリを作りました
カラオケ曲管理アプリを作りました
Swift3とObjective-Cのブリッジでハマったこと
1.
Swift3とObjective-Cのブ リッジでハマったこと @yousan 集まれSwift好き!Swift愛好会 Vol12
2.
自己紹介 • @yousan • iOSアプリエンジニア •
趣味 テニス
3.
Swift3移行中 Objective-Cでクラッシュ
4.
let person =
Person(nickname: "yousan") let uppercaseNickname = ObjCUtils.convert(toUppercase: person.nickname) print(uppercaseNickname) @implementation ObjCUtils + (nonnull id)convertToUppercase:(nonnull id)string { return [string uppercaseString]; } @end Swift Objective-C
5.
Terminating app due
to uncaught exception 'NSInvalidArgumentException
6.
let person =
Person(nickname: "yousan") let uppercaseNickname = ObjCUtils.convert(toUppercase: person.nickname) print(uppercaseNickname) @implementation ObjCUtils + (nonnull id)convertToUppercase:(nonnull id)string { return [string uppercaseString]; } @end Swift Objective-C struct Person { let nickname: String? } オプショナルでした Swift2のときはAnyObjectだったので コンパイル時にエラーになっていた
7.
id → Anyの注意 +
(nonnull id)convertToUppercase:(nonnull id)string; class func convert(toUppercase string: Any) -> Any class func convertToUppercase(string: AnyObject) -> AnyObject Swift2 Swift3 オプショナルは引数に渡せない オプショナルも引数に渡せる Objective-C nonnullでもコンパイルエラーにならない
8.
idである必要がなければ型を指定 + (nonnull NSString
*)convertToUppercase:(nonnull NSString *)string; class func convert(toUppercase string: String) -> String Objective-C Swift3 NSArray, NSDictionary, NSSetはジェネリクスを指定 + (nonnull NSArray<NSString *>)convertToUppercase:(nonnull NSArray<NSString *>)strings; class func convert(toUppercase strings: [String]) -> [String] Objective-C Swift3 外部ライブラリは気をつけるしかない
9.
なぜこんな改変を?
10.
• SE-0116 https://github.com/apple/swift-evolution/blob/master/proposals/0116-id-as-any.md • Objective-C
id as Swift Any - Swift Blog https://developer.apple.com/swift/blog/?id=39 • 5分でわかるSE-0116(id-as-any) // Speaker Deck https://speakerdeck.com/takasek/5fen-dewakaruse-0116-id-as-any
11.
Swift2 // StringがAnyObjectに暗黙的に変換されている let converted
= ObjCUtils.convertToUppercase("yousan") 書きやすいように暗黙的にAnyObjectに変換している 本来関係のない型に、しかも暗黙的に変換されるのは 色々な問題を生むのではないか?
12.
Swift3 let name: AnyObject
= "yousan" as AnyObject // AnyObjectへの変換を明示 let converted = ObjCUtils.convert(toUppercase: name) let uppercaseNickname: String = converted as! String print(uppercaseNickname) 該当する場所全てにこれを書くのは大変 SE-0072 Fully eliminate implicit bridging conversions from Swift
13.
AnyObjectをAnyにすれば • AnyObjectへの暗黙変換は発生しない • AnyObjectへの変換処理も書く必要がない •
全てのSwiftの型をObjective-Cに渡せる ※ 渡した結果どうなるかはコンパイラに任せる 将来的には全てのSwiftの型をブリッジしたい
14.
Objective-Cに対応する型がな い場合どうなるか • _SwiftValueというクラスとして受け取る • 今後もObjective-Cに対応づけられるSwiftの型は 増えていくので、この型に依存するべきではな い
15.
例えば https://github.com/apple/swift-evolution/blob/master/proposals/0139-bridge-nsnumber-a • Int16 →
_SwiftValue • CGRect → _SwiftValue Swift 3.0.1 • Int16 → NSNumber • CGRect → NSValue Swift 3.0
16.
まとめ • Objective-Cでidに値を渡すときはオプショナル に注意 • Objective-Cに渡せるSwiftの型は今後も増えてい くと思われます
Jetzt herunterladen