読者です 読者をやめる 読者になる 読者になる

Pebble's Diary

プログラマーの作業メモ

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

swift

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() でインスタンスが一つのみ作られ、 全ての要素に同じインスタンスが追加されてしまっているせいですね。要注意です。