Pebble Coding

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

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

swiftでは構造体は値渡し、クラスは参照渡しと言われますが、実際に使ってみて失敗した方が理解が早いです。 以下のサンプルと実行結果を見てみます。

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 v1:[CPoint] = [CPoint](count: 2, repeatedValue: CPoint())
var v2:[SPoint] = [SPoint](count: 2, repeatedValue: SPoint())
var v3:[CPoint] = [CPoint]()
for var i = 0; i < 2; ++i {
    v3.append(CPoint())
}

v1[0].x = 1
v1[0].y = 2
v1[1].x = 3
v1[1].y = 4

v2[0].x = 5
v2[0].y = 6
v2[1].x = 7
v2[1].y = 8

v3[0].x = 9
v3[0].y = 10
v3[1].x = 11
v3[1].y = 12

println( v1.description )
println( v2.description )
println( v3.description )

// 実行結果
// [x[3] y[4], x[3] y[4]]
// [x[5] y[6], x[7] y[8]]
// [x[9] y[10], x[11] y[12]]

値が1,2になりそうなところが、3,4になっているのは、repeatedValue: CPoint() でインスタンスが一つのみ作られ、 全ての要素に同じインスタンスが追加されてしまっているせいですね。要注意です。