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
- 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
外部ライブラリは気をつけるしかない
- 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