SwiftのAnyObjectとAnyの違い

  • 21
    Like
  • 0
    Comment
More than 1 year has passed since last update.

AnyObjectとAny

The Swift Programming Language (Swift 2.1) - Type Castingの内容となりますが、実際のコードを見ながら、違いを書いていきます。

型を指定しないインスタンスについて、Swiftでは、以下の2種類の型エイリアスが存在します。

  • AnyObject
    • クラス型のインスタンス
      • CocoaのAPIを使用する場合
  • Any
    • 関数型を含んだ全ての型のインスタンス

ここで、気になってくるのが、数値型などのCocoaとSwift Standard Libraryに共通して存在するものをAnyObjectAnyで宣言した変数・定数に代入した時、実際の型はどのように扱われるのか? という点です。

コード例

let anyObjNumber: AnyObject = 10
let anyNumber: Any = 10

let anyObjFloatingNumber: AnyObject = 12.34
let anyFloatingNumber: Any = 12.34

let anyObjString: AnyObject = "string"
let anyString: Any = "string"

let anyObjBool: AnyObject = false
let anyBool: Any = false

print("\(anyObjNumber) - \(anyObjNumber.dynamicType)")
print("\(anyNumber) - \(anyNumber.dynamicType)")

print("\(anyObjFloatingNumber) - \(anyObjFloatingNumber.dynamicType)")
print("\(anyFloatingNumber) - \(anyFloatingNumber.dynamicType)")

print("\(anyObjString) - \(anyObjString.dynamicType)")
print("\(anyString) - \(anyString.dynamicType)")

print("\(anyObjBool) - \(anyObjBool.dynamicType)")
print("\(anyBool) - \(anyBool.dynamicType)")

上記のコードを実行した結果は、以下のようになります。

10 - _NSCFNumber
10 - Int
12.34 - __NSCFNumber
12.34 - Double
string - _NSContiguousString
string - String
0 - _
NSCFBoolean
false - Bool

AnyObjectで宣言した定数では、値は全てNSのプリフィックスが付いていることから、Cocoaで定義されているクラスのインスタンスとして扱われています。
Anyで宣言した定数は、それぞれ、Swiftのライブラリで定義されている構造体のインスタンスとなっています。