Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

swiftで構造体またはクラスをArrayにする際に気をつけること(2)

class CPoint :Printable {
    var x:Int = 0
    var y:Int = 0
    init() {}
    var description:String {
        return "x[\(x)] y[\(y)]"
    }
}

struct SPoint :Printable {
    var x:Int = 0
    var y:Int = 0
    var description:String {
        return "x[\(x)] y[\(y)]"
    }
}

var v2:[SPoint] = [SPoint](count: 2, repeatedValue: SPoint())
var v3:[CPoint] = [CPoint]()
for var i = 0; i < 2; ++i {
    v3.append(CPoint())
}
var v4:[SPoint] = [SPoint](count: 2, repeatedValue: SPoint())

v2[0].x = 5
v2[0].y = 6
v2[1].x = 7
v2[1].y = 8
for var i = 0; i < 2; ++i {
    var v = v2[i]
    v.x += 1000
}

v3[0].x = 9
v3[0].y = 10
v3[1].x = 11
v3[1].y = 12
for var i = 0; i < 2; ++i {
    var v = v3[i]
    v.x += 1000
}

v4[0].x = 13
v4[0].y = 14
v4[1].x = 15
v4[1].y = 16
for var i = 0; i < 2; ++i {
    v4[i].x += 1000
}

println( v2.description )
println( v3.description )
println( v4.description )

// 実行結果
// [x[5] y[6], x[7] y[8]]
// [x[1009] y[10], x[1011] y[12]]
// [x[1013] y[14], x[1015] y[16]]

ArrayはC++vectorで実装されているそうなのでC++に精通している人にとっては、
structを要素にした場合は、

std::vector<SPoint>  

classを要素にすると

std::vector<SPoint*>  

と宣言したのと同じと考えればよさそうです。 ただし、C++の参照の機能はswiftにはありませんので、 v3の場合のように、要素を別変数に入れて参照したい場合は、要素をstructではなく、classで作る必要があります。 FloatやIntなどプリミティブな要素をArrayにする場合を除いては、Arrayの要素にはclassを使うのがよさそうです。