Swift 構造体

Swift 構造体は、コードを構築するために用いられる、汎用性が高く柔軟な構造体です。

構造体にはプロパティ(定数、変数)を定義したり、メソッドを追加したりして、構造体の機能を拡張することができます。

C および Objective-C とは異なる点は、次のとおりです。

  • 構造体には、実装ファイルとインターフェースを含める必要はありません。

  • 構造体は単一のファイルを作成することを可能にし、システムが他のコードに対する外部インターフェースを自動的に生成します。

構造体は常にコピーされてコード内で渡されるため、その値は変更できません。

構文

キーワード struct を使用して構造体を定義します:

struct nameStruct { 
   Definition 1
   Definition 2
   ……
   Definition N
}

例

MarkStruct という名前の構造体を定義します。構造体のプロパティは学生の3科目の点数であり、データ型は Int です。

struct MarkStruct{
   var mark1: Int
   var mark2: Int
   var mark3: Int
}

構造体名を使って構造体のメンバーにアクセスできます。

構造体のインスタンス化には、letキーワード <code>let</code> を使用します:

import Cocoa

struct studentMarks {
   var mark1 = 100
   var mark2 = 78
   var mark3 = 98
}
let marks = studentMarks()
print("Mark1 是 \(marks.mark1)")
print("Mark2 是 \(marks.mark2)")
print("Mark3 是 \(marks.mark3)")

上記のプログラムを実行すると、出力結果は次のようになります。

Mark1 是 100
Mark2 是 78
Mark3 是 98

例では、構造体名 'studentMarks' を使って学生の成績にアクセスします。構造体メンバーは mark1、mark2、mark3 に初期化され、データ型は整数型です。

次に、<code>let</code> キーワードを使用して、let構造体 studentMarks() をインスタンス化し、marks に渡します。

最後に、<code>.</code> 記号を使って、.構造体メンバーの値にアクセスします。

以下のインスタンス化では、構造体のインスタンス化時に値を渡して、構造体をクローンします:

import Cocoa

struct MarksStruct {
   var mark: Int

   init(mark: Int) {
      self.mark = mark
   }
}
var aStruct = MarksStruct(mark: 98)
var bStruct = aStruct // aStruct 和 bStruct 是使用相同值的结构体!
bStruct.mark = 97
print(aStruct.mark) // 98
print(bStruct.mark) // 97

上記のプログラムを実行すると、出力結果は次のようになります。

98
97

構造体の応用

コード内では、構造体を使用して独自のカスタムデータ型を定義できます。

構造体のインスタンスは常に値渡しされ、独自のカスタムデータ型を定義するために使われます。

一般的なガイドラインとして、次の条件の1つ以上に該当する場合は、構造体の構築を検討してください:

  • 構造体の主な目的は、少数の関連する単純なデータ値をカプセル化することです。
  • 構造体インスタンスの代入または渡しの際に、カプセル化されたデータが参照ではなくコピーされると合理的に予想できる場合。
  • 構造体に格納される値型のプロパティも、参照されるのではなくコピーされます。
  • 構造体は、既存の別の型の属性や振る舞いを継承する必要はありません。

例えば、次のような状況では構造体の使用が適しています:

  • 幾何学的形状のサイズ、カプセル化するのはwidth<code>width</code> プロパティとheight<code>height</code> プロパティで、両方ともDouble<code>Double</code> 型です。
  • 一定範囲内のパス、カプセル化するのはstart<code>start</code> プロパティとlength<code>end</code> プロパティで、両方ともInt<code>Int</code> 型です。
  • 三次元座標系内の点、カプセル化するのはx,yとz<code>x</code>、<code>y</code>、<code>z</code> プロパティで、三つともDouble<code>Double</code> 型です。

構造体のインスタンスは、参照ではなく値渡しで渡されます。

import Cocoa

struct markStruct{
    var mark1: Int
    var mark2: Int
    var mark3: Int
    
    init(mark1: Int, mark2: Int, mark3: Int){
        self.mark1 = mark1
        self.mark2 = mark2
        self.mark3 = mark3
    }
}

print("优异成绩:")
var marks = markStruct(mark1: 98, mark2: 96, mark3:100)
print(marks.mark1)
print(marks.mark2)
print(marks.mark3)

print("糟糕成绩:")
var fail = markStruct(mark1: 34, mark2: 42, mark3: 13)
print(fail.mark1)
print(fail.mark2)
print(fail.mark3)

上記のプログラムを実行すると、出力結果は次のようになります。

优异成绩:
98
96
100
糟糕成绩:
34
42
13

上記の例では、構造体 markStruct を定義しました。3つのメンバープロパティは mark1、mark2、mark3 です。構造体内では、メンバープロパティにアクセスするために self キーワードを使用します。

この例から、構造体のインスタンスが値渡しであることをよく理解できます。

その他の拡張