構造体はクラスとよく似ています。

struct StructPoint {
    var x = 0
    var y = 0

    init() {
    }

    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

クラスとの違いは構造体を他の変数へ渡すと、値渡し、つまりコピーを渡すことになることです。

var point1 = StructPoint()
point1.x = 100
point1.y = 200

// point1のコピーがpoint2へ渡される
var point2 = point1
// point1.x => 100
// point1.y => 200
// point1.x => 100
// point1.y => 200

// point2のプロパティを変更しても、point1のプロパティは変わらない
point2.x = 1000
point2.y = 2000
// point1.x => 100
// point1.y => 200
// point1.x => 1000
// point1.y => 2000

メソッドの追加

構造体へもクラスと同じようにメソッド追加ができますが、いくつか異なる点があります。

さきほどのStructPointに以下のメソッドを追加します。

func move1(offsetX: Int, offsetY: Int) -> StructPoint {
    var result = self
    result.x += offsetX
    result.y += offsetY
    return result
}

このメソッドはselfのプロパティには変更を加えません。

次はselfのプロパティに変更を加えるメソッドです。

mutating func move2(offsetX: Int, offsetY: Int) {
    // x, yはselfのプロパティ
    x += offsetX
    y += offsetY
}

構造体はselfのプロパティを書き換えるメソッドは先頭にmutatingをつける必要があります。

構造体かクラスどちらにするか

慣れないうちは構造体かクラスどちらで宣言するか悩むかもしれません。その件については下記の記事にまとめましたので参考になれば幸いです。

Swiftで構造体、クラスどちらが良いかを考える基準