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を使うのがよさそうです。