際際滷

際際滷Share a Scribd company logo
Swift3とObjective-Cのブ
リッジでハマったこと
@yousan
鹿まれSwift挫きSwift杠短 Vol12
徭失B初
? @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だったので
コンパイルrにエラ`になっていた
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に圧a議にQされている
let converted = ObjCUtils.convertToUppercase("yousan")
きやすいように圧a議にAnyObjectにQしている
云栖vSのない侏に、しかも圧a議にQされるのは
弼?な}を伏むのではないか
Swift3
let name: AnyObject = "yousan" as AnyObject // AnyObjectへのQを苧幣
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への圧aQはk伏しない
? AnyObjectへのQI尖もく駅勣がない
? 畠てのSwiftの侏をObjective-Cに局せる
☆ 局したY惚どうなるかはコンパイラに販せる
繍栖議には畠ての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の侏は書瘁もえてい
くと房われます

More Related Content

皆敬庄韓岳3と或恢逮艶界岳庄厩艶-遺のブリッジでハマったこと