値型の中のプロパティをインスタンスメソッド内でいじる

このエントリーをはてなブックマークに追加

structとenumは値型なので、通常は値型のプロパティを自身のインスタンスメソッド内で変更することはできません。

まずは参照型であるclassでプロパティの変更を行ってみます。(通常こんなクラス作らないけど)

class PointClass {
    var x = 0.0, y = 0.0
    init(x: Double, y: Double) {
        self.x = x
        self.y = y
    }
    // classは参照型なので自身のインスタンスメソッド内でプロパティを変更できる
    func moveByX(deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}

var classPoint = PointClass(x: 1.0, y: 1.0)
classPoint.moveByX(2.0, y: 3.0)
println("The class point is now at (\(classPoint.x), \(classPoint.y))")
// 出力結果
// The class point is now at (3.0, 4.0)

見たまんまです。普通にメソッドを定義してそのメソッド内でプロパティを変更しています。
これがstructの場合どうするかと言いますと、funcの前にmutatingというキーワードをつけるのです。

struct PointStruct {
    var x = 0.0, y = 0.0
    // structは値型なので通常は自身のインスタンスメソッド内でプロパティの変更はできない。
    // が!mutatingをつけることで可能に!
    mutating func moveByX(deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}
var structPoint = PointStruct(x: 1.0, y: 1.0)
structPoint.moveByX(2.0, y: 3.0)
println("The struct point is now at (\(structPoint.x), \(structPoint.y))")
// 出力結果
// The struct point is now at (3.0, 4.0)

こうすることで値型であるstructのプロパティを自身のインスタンスメソッド内で変更可能に!ちなみにmutatingをつけない場合どうなるかというと、コンパイラに怒られます。

Playground execution failed: error: <REPL>:26:11: error: could not find an overload for '+=' that accepts the supplied arguments
x += deltaX
~~^~~~~~~~~
<REPL>:27:11: error: could not find an overload for '+=' that accepts the supplied arguments
y += deltaY

Enumの場合は下のように書くことで自身の値を変更可能です。

enum Mode : String {
    case X = "X mode"
    case Y = "Y mode"
    // struct同様「mutating」をつけることで自身を変更可能
    mutating func switchMode() {
        self = self == X ? Y : X
    }
}
var mode = Mode.X
println("The mode is now \(mode.toRaw()).")
// 出力結果:The mode is now X mode.
mode.switchMode()
println("The mode is now \(mode.toRaw()).")
// 出力結果:The mode is now Y mode.

Enumもmutatingをつけない場合はコンパイラに怒られます。

Playground execution failed: error: <REPL>:42:14: error: cannot assign to 'self' in a method
        self = self == X ? Y : X
        ~~~~ ^

 

Written on June 4, 2014
このエントリーをはてなブックマークに追加