[Swift]AnyObjectとAnyと総称型(T)の違いをメモったよ!

  • 103
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで Braian になっちゃった。

AnyとAnyObject

AnyObject

〜どういう場面で使用するのか?〜
配列や辞書などを使ってインスタンスをまとめる場合、決まった型の値しか保管できない。なので 「AクラスのインスタンスとBクラスのインスタンスをひとまとめにしたい」 それができないのです!!!
つまりこんな時とか

var a: [String] = ["a", "b", "c", 1, 2, 3]
var b: [Int] = ["a", "b", "c", 1, 2, 3]
// もちろん両方ともエラー

そんなとき、助けてくれるのが AnyObject です!これはオブジェクトであればなんでも保管することができます。

var a: [AnyObject] = ["a", "b", "c", 1, 2, 3]
// ["a", "b", "c", 1, 2, 3]

Any

AnyObjectでは関数(function)や構造体(Struct)が使用できない...
がしかし、"Any"ではそれが使用できます!!!

//構造体
struct myStruct {
    var a: Int = 1
}
//
var b: AnyObject = myStruct() //エラー
var c: Any = myStruct() //成功
//関数(function)
let a = { (i: Int) -> Int in
    return 1
}
var b: AnyObject = a //エラー
var c: Any = a //成功

総称型(T)

〜使用する型を特定する総称型〜
さまざまな種類のオブジェクトをまとめて処理する際に考えなくてはならないのが『どういう種類のオブジェクトに対応させるか』です。
例えば、多数のオブジェクトを 1つの配列 にまとめることを考えてみたとき、特定の型を指定して配列を作れば、その種だけしかいれることができなくなります。がしかし、 AnyObject などを使用すればどんな型でもいれることができるようになります。
AnyObjectやAnyは 「どんな値でどんな型のものがくるかわからない」 といった場面で使用される型です。

では、 「どんな値がくるかわからないが、とにかくその種類のインスタンスだけを保管するのは間違いない」 つまり 「IntかStringかDoubleかわからないが、同じ型の値だけが設定される」 といった場面ですね。

総称型のクラス定義

class クラス <T> {
    var プロパティ: T
    func メソッド(引数: T) {....}
}

(注)総称型では、使用するクラスを指し示すものとして T を記述します。Tを記述することによって総称型を使用するクラスであることを示す。

class MyData<T> {
    var data: [T] = [T]()  

    func add(data: T) {
        self.data.append(data)
}

func print() {
    var res: String = ""
    for val in data {
        res += "\(val)"
    }
    println(res)
}
}

var obj1 = MyData<Int>()  //Int型
obj1.add(123)
obj1.add(456)
obj1.println()

var obj2 = MyData<String>()  //String型
obj2.add("Hello")
obj2.add("World")
obj2.println()

これは『Int型』と『String型』を保管できるようにしたのです。
このように総称型では 保管するデータの種類を設定したインスタンスを複数作れる のです。これが総称型の大きな利点になります!!

僕にとって理解するのが難しい内容でしたが、今回の内容はもっともっと理解を深めたいとおもいます!!

不備やこのほうがいいなどアドバイスがあればコメントしていただけると幸いです。まだまだ未熟者ですのでどうぞ宜しくお願い致します!!!