iOS
Swift
Swift3.0
ios10
swift3

Swift3での大きな変更点(AnyObject→Any)Dictionary,Arrayなどでの型指定方法まとめ

More than 1 year has passed since last update.


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