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 キーワードを使用します。
この例から、構造体のインスタンスが値渡しであることをよく理解できます。
その他の拡張