Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Swift辞典

  1. トップページ
  2. Swift辞典
  3. struct の基本 / memberwise initializer

struct の基本 / memberwise initializer

Swiftの『struct』(構造体)は値型のデータ型です。プロパティとメソッドを持つことができ、クラスとは異なりコピーで渡されます。

構文
struct 構造体名 {
    // 格納型プロパティ
    var プロパティ1: 型
    let プロパティ2: 型

    // カスタムイニシャライザ(省略すると自動生成)
    init(プロパティ1: 型, プロパティ2: 型) {
        self.プロパティ1 = プロパティ1
        self.プロパティ2 = プロパティ2
    }

    // メソッド(プロパティを変更するメソッドは mutating)
    mutating func メソッド名() {
        プロパティ1 = 新しい値
    }
}
構文一覧
構文概要
struct 名前 { ... }構造体を定義します。
memberwise initializerプロパティに対応するイニシャライザが自動生成されます。
mutating func構造体のプロパティを変更するメソッドに必要です。
値型(コピーセマンティクス)代入や引数渡しでコピーが作成されます。
static var / funcインスタンスではなく型に属するプロパティ・メソッドを定義します。
サンプルコード
// struct の定義
struct Point {
    var x: Double
    var y: Double

    // 距離を計算するメソッド
    func distance(to other: Point) -> Double {
        let dx = x - other.x
        let dy = y - other.y
        return (dx * dx + dy * dy).squareRoot()
    }

    // プロパティを変更する mutating メソッド
    mutating func move(dx: Double, dy: Double) {
        x += dx
        y += dy
    }

    // 説明文
    var description: String {
        return "(\(x), \(y))"
    }
}

// memberwise initializer を使用(カスタム init なし)
var p1 = Point(x: 0.0, y: 0.0)
let p2 = Point(x: 3.0, y: 4.0)

print("p1: \(p1.description)")
print("p2: \(p2.description)")
print("距離: \(p1.distance(to: p2))")

// 値型: コピーセマンティクス
var p3 = p1      // コピーが作られる
p3.move(dx: 1.0, dy: 1.0)
print("p1(変わらず): \(p1.description)")
print("p3(変更後): \(p3.description)")

// 定数(let)の struct はプロパティを変更できない
let fixedPoint = Point(x: 5.0, y: 5.0)
// fixedPoint.move(dx: 1, dy: 1)  // エラー: let なので変更不可
概要

Swiftの『struct』は値型であり、変数に代入したり関数に渡したりするとコピーが作られます。これにより、意図しない共有状態による不具合を防ぎやすくなります。

カスタムイニシャライザを定義しない場合、全プロパティを引数に持つ memberwise initializer(メンバーワイズイニシャライザ)が自動生成されます。『let』で宣言した構造体のインスタンスは全プロパティが変更不可になります。mutating メソッドも呼び出せません。

クラス(参照型)についてはclass の基本 / init() / deinit()を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。