Swift の AnyObject と Any メモ
AnyObject と Any についてのメモ。
AnyObject
- AnyObjectは 全てのクラス型のインスタンス を表すことができる型
Swiftのクラス、Objective-Cを継承したクラス、Objective-Cのクラスを扱うことができる。
class SwiftClass {} @objc class ObjCClass: NSObject {} let swift: AnyObject = SwiftClass() let objcObj: AnyObject = ObjCClass() let nsobj: AnyObject = NSObject() let array: [AnyObject] = [swift, objcObj, nsobj]
struct, enum, 関数(クロージャ), タプルはクラス型のインスタンスではないので、AnyObjectで扱うことはできない。
以下の例は、エラーになる。
struct Struct {} enum Direction { case Up; case Down } let strct: AnyObject = Struct() let fnc: AnyObject = { (x: Int) in print(x) } let dir: AnyObject = Direction.Up let tuple: AnyObject = () // 下記のようなエラーメッセージが出る // value of type 'Struct' does not conform to specified type 'AnyObject'
Any
- Anyは関数型も含め、全ての型のインスタンス を表すことができる型
Anyならstruct, enum, 関数(クロージャ), タプルも扱える。
struct Struct {} enum Direction { case Up; case Down } let swift: Any = SwiftClass() let objc: Any = NSObject() let strct: Any = Struct() let fnc: Any = { (x: Int) in print(x) } let dir: Any = Direction.Up let tuple: Any = () let array: [Any] = [swift, objc, strct, fnc, dir, tuple]