Swift3へ移行時に発生する大きな問題点
Swift3になって、APIを使用していてJSONをパースしているようなアプリが特に影響を受ける変更がありました。
###それは、AnyObject型 が Any型 に置き変わったことです!!
これによって、JSONを受け取る際の型の指定などが変わることになります。APIを沢山使っているアプリは影響範囲が広くなると思います。
Objective-C, Swift2, swift3の型違い対応表
Objective-C | Swift2 | Swift3 |
---|---|---|
id |
AnyObject |
Any |
NSArray * |
[AnyObject] |
[Any] |
NSDictionary * |
[NSObject: AnyObject] |
[AnyHashable: Any] |
NSSet * |
Set<NSObject> |
Set<AnyHashable> |
具体的なコードで見ていきましょう
Dictionary(今まで)
filename.swift
var dictionaryObject: [String: AnyObject] = [
"key1": "文字列1",
"key2": 1,
"key3": true
]
Dictionary(Swift3)
filename.swift
var dictionaryObject: [String: Any] = [ //AnyObjectがAnyに替わる!
"key1": "文字列1",
"key2": 1,
"key3": true
]
NSDictionary(今まで)
filename.swift
var nsdictionaryObject: [NSObject: AnyObject] = [
"key1": "文字列1",
"key2": 1,
"key3": true
]
NSDictionary(Swift3)
filename.swift
var nsdictionaryObject: [AnyHashable: Any] = [ //NSObjectがAnyHashableに、AnyObjectがAnyに替わる!
"key1": "文字列1",
"key2": 1,
"key3": true
]
Array(今まで)
filename.swift
var arrayObject: [AnyObject] = [
"文字列1",
1,
true
]
Array(Swift3)
filename.swift
var arrayObject: [Any] = [ //AnyObjectがAnyに替わる!
"文字列1",
1,
true
]
JSONシリアライズ(今まで)
filename.swift
let object: AnyObject = try JSONSerialization.jsonObject(with: data, options: opt)
JSONシリアライズ(Swift3)
filename.swift
let object: Any = try JSONSerialization.jsonObject(with: data, options: opt)
編集後記
Swift3へ移行するときに、多くのアプリはこの改修が必用になると思われます。結構大きな変更ですよね。
AlamofireやSwiftyJSONなど有名なライブラリも同様の修正がプルリクにあがってました。
何か間違っている点などありましたらご指摘ください。
参考文献
https://apple.github.io/swift-evolution/
https://www.mail-archive.com/swift-users@swift.org/msg01909.html
http://stackoverflow.com/questions/38963362/xcode-8-beta-6-anyobject-replaced-by-any-where-is-classforcoder