SlideShare ist ein Scribd-Unternehmen logo
1 von 16
Downloaden Sie, um offline zu lesen
Swift3とObjective-Cのブ
リッジでハマったこと
@yousan
集まれSwift好き!Swift愛好会 Vol12
自己紹介
• @yousan
• iOSアプリエンジニア
• 趣味 テニス
Swift3移行中
Objective-Cでクラッシュ
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
Terminating app due to uncaught exception 'NSInvalidArgumentException
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だったので
コンパイル時にエラーになっていた
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でもコンパイルエラーにならない
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
外部ライブラリは気をつけるしかない
なぜこんな改変を?
• 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
Swift2
// StringがAnyObjectに暗黙的に変換されている
let converted = ObjCUtils.convertToUppercase("yousan")
書きやすいように暗黙的にAnyObjectに変換している
本来関係のない型に、しかも暗黙的に変換されるのは
色々な問題を生むのではないか?
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
AnyObjectをAnyにすれば
• AnyObjectへの暗黙変換は発生しない
• AnyObjectへの変換処理も書く必要がない
• 全てのSwiftの型をObjective-Cに渡せる
※ 渡した結果どうなるかはコンパイラに任せる
将来的には全てのSwiftの型をブリッジしたい
Objective-Cに対応する型がな
い場合どうなるか
• _SwiftValueというクラスとして受け取る
• 今後もObjective-Cに対応づけられるSwiftの型は
増えていくので、この型に依存するべきではな
い
例えば
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
まとめ
• Objective-Cでidに値を渡すときはオプショナル
に注意
• Objective-Cに渡せるSwiftの型は今後も増えてい
くと思われます

Weitere ähnliche Inhalte

Andere mochten auch

AKIBA.swift vol.1
AKIBA.swift vol.1AKIBA.swift vol.1
AKIBA.swift vol.1cocominap
 
モダンな開発現場になるためのお作法としてのツール活用
モダンな開発現場になるためのお作法としてのツール活用モダンな開発現場になるためのお作法としてのツール活用
モダンな開発現場になるためのお作法としてのツール活用智治 長沢
 
プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__Tomohiro Kumagai
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」Tsuyoshi Watanabe
 
多人数iOSアプリ開発を考える
多人数iOSアプリ開発を考える多人数iOSアプリ開発を考える
多人数iOSアプリ開発を考えるsasaron 397
 
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!Kanako Kobayashi
 
ナレッジを共有する文化をつくるために
ナレッジを共有する文化をつくるためにナレッジを共有する文化をつくるために
ナレッジを共有する文化をつくるためにRecruit Lifestyle Co., Ltd.
 
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドYAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドkeroyonn
 
Swiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考えるSwiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考えるTakuya Kitamura
 
Swift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDCSwift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDCTomohiro Kumagai
 
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobileNS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobileTomohiro Kumagai
 
Androidアプリケーション開発入門
Androidアプリケーション開発入門Androidアプリケーション開発入門
Androidアプリケーション開発入門OESF Education
 
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashiコンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashiMasaki Hayashi
 
Carthageについて知りたいn個のこと
Carthageについて知りたいn個のことCarthageについて知りたいn個のこと
Carthageについて知りたいn個のことSyo Ikeda
 
Sketchで変わるワークフロー
Sketchで変わるワークフローSketchで変わるワークフロー
Sketchで変わるワークフローAsami Yamamoto
 

Andere mochten auch (18)

AKIBA.swift vol.1
AKIBA.swift vol.1AKIBA.swift vol.1
AKIBA.swift vol.1
 
モダンな開発現場になるためのお作法としてのツール活用
モダンな開発現場になるためのお作法としてのツール活用モダンな開発現場になるためのお作法としてのツール活用
モダンな開発現場になるためのお作法としてのツール活用
 
プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
 
多人数iOSアプリ開発を考える
多人数iOSアプリ開発を考える多人数iOSアプリ開発を考える
多人数iOSアプリ開発を考える
 
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
 
ナレッジを共有する文化をつくるために
ナレッジを共有する文化をつくるためにナレッジを共有する文化をつくるために
ナレッジを共有する文化をつくるために
 
チケット駆動で加速する顧客と協業するプロジェクトマネジメント
チケット駆動で加速する顧客と協業するプロジェクトマネジメントチケット駆動で加速する顧客と協業するプロジェクトマネジメント
チケット駆動で加速する顧客と協業するプロジェクトマネジメント
 
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドYAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
 
Swiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考えるSwiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考える
 
Swift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDCSwift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDC
 
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobileNS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
 
Androidアプリケーション開発入門
Androidアプリケーション開発入門Androidアプリケーション開発入門
Androidアプリケーション開発入門
 
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashiコンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
 
Carthageについて知りたいn個のこと
Carthageについて知りたいn個のことCarthageについて知りたいn個のこと
Carthageについて知りたいn個のこと
 
Android概要資料
Android概要資料Android概要資料
Android概要資料
 
Sketchで変わるワークフロー
Sketchで変わるワークフローSketchで変わるワークフロー
Sketchで変わるワークフロー
 

Mehr von 庸介 高橋

Cookpad TechConf 2019 - Build Chat with Firestore
Cookpad TechConf 2019 - Build Chat with FirestoreCookpad TechConf 2019 - Build Chat with Firestore
Cookpad TechConf 2019 - Build Chat with Firestore庸介 高橋
 
最新技術に挑戦し続ける LIFULL HOME'Sアプリの開発について
最新技術に挑戦し続ける LIFULL HOME'Sアプリの開発について最新技術に挑戦し続ける LIFULL HOME'Sアプリの開発について
最新技術に挑戦し続ける LIFULL HOME'Sアプリの開発について庸介 高橋
 
【ヒカラボ 2018/02/01】iOS LIFULL HOME'Sアプリリニューアルの裏側
【ヒカラボ 2018/02/01】iOS 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による特集配信LIFULL HOME'S Firebaseによる特集配信
LIFULL HOME'S Firebaseによる特集配信庸介 高橋
 
tvOS開発前に確認すべきこと
tvOS開発前に確認すべきことtvOS開発前に確認すべきこと
tvOS開発前に確認すべきこと庸介 高橋
 
Jenkins + Deploygateを使った簡単ベータ配信
Jenkins + Deploygateを使った簡単ベータ配信Jenkins + Deploygateを使った簡単ベータ配信
Jenkins + Deploygateを使った簡単ベータ配信庸介 高橋
 
家族の「ただいま」を教えてくれるキーホルダー NFC版
家族の「ただいま」を教えてくれるキーホルダー NFC版家族の「ただいま」を教えてくれるキーホルダー NFC版
家族の「ただいま」を教えてくれるキーホルダー NFC版庸介 高橋
 
おうちハック発表会 #5 家族の「ただいま」を教えてくれるキーホルダー
おうちハック発表会 #5 家族の「ただいま」を教えてくれるキーホルダーおうちハック発表会 #5 家族の「ただいま」を教えてくれるキーホルダー
おうちハック発表会 #5 家族の「ただいま」を教えてくれるキーホルダー庸介 高橋
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック庸介 高橋
 
カラオケ曲管理アプリを作りました
カラオケ曲管理アプリを作りましたカラオケ曲管理アプリを作りました
カラオケ曲管理アプリを作りました庸介 高橋
 

Mehr von 庸介 高橋 (10)

Cookpad TechConf 2019 - Build Chat with Firestore
Cookpad TechConf 2019 - Build Chat with FirestoreCookpad TechConf 2019 - Build Chat with Firestore
Cookpad TechConf 2019 - Build Chat with Firestore
 
最新技術に挑戦し続ける LIFULL HOME'Sアプリの開発について
最新技術に挑戦し続ける LIFULL HOME'Sアプリの開発について最新技術に挑戦し続ける LIFULL HOME'Sアプリの開発について
最新技術に挑戦し続ける LIFULL HOME'Sアプリの開発について
 
【ヒカラボ 2018/02/01】iOS LIFULL HOME'Sアプリリニューアルの裏側
【ヒカラボ 2018/02/01】iOS 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による特集配信LIFULL HOME'S Firebaseによる特集配信
LIFULL HOME'S Firebaseによる特集配信
 
tvOS開発前に確認すべきこと
tvOS開発前に確認すべきことtvOS開発前に確認すべきこと
tvOS開発前に確認すべきこと
 
Jenkins + Deploygateを使った簡単ベータ配信
Jenkins + Deploygateを使った簡単ベータ配信Jenkins + Deploygateを使った簡単ベータ配信
Jenkins + Deploygateを使った簡単ベータ配信
 
家族の「ただいま」を教えてくれるキーホルダー NFC版
家族の「ただいま」を教えてくれるキーホルダー NFC版家族の「ただいま」を教えてくれるキーホルダー NFC版
家族の「ただいま」を教えてくれるキーホルダー NFC版
 
おうちハック発表会 #5 家族の「ただいま」を教えてくれるキーホルダー
おうちハック発表会 #5 家族の「ただいま」を教えてくれるキーホルダーおうちハック発表会 #5 家族の「ただいま」を教えてくれるキーホルダー
おうちハック発表会 #5 家族の「ただいま」を教えてくれるキーホルダー
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
 
カラオケ曲管理アプリを作りました
カラオケ曲管理アプリを作りましたカラオケ曲管理アプリを作りました
カラオケ曲管理アプリを作りました
 

Swift3とObjective-Cのブリッジでハマったこと