タコさんブログ

プログラミングメモと小言

Swift の AnyObject と Any メモ

AnyObject と Any についてのメモ。

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]