Contents

スウィフト – 構造
Swift 4は構造物として構造物を使用する柔軟なビルディングブロックを提供します。これらの構造を利用することによって、一度、構造のメソッドとプロパティを定義できます。
CおよびObjective Cとのちがいは
構造体では継承は利用できません。
構造体にデイニシャライザは定義できません。デストラクタに近い ※「コンストラクタ」の逆。
もう少し具体的に書くとオブジェクト指向のプログラミング言語で登場する用語で、(人間様の目から見て)インスタンスが破棄されたタイミングで実行されるメソッドのことです。
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Say {
init() {
print(“あ”)
}
deinit {
print(“い”)
}
func hello() {
print(“う”)
}
}
func call() {
let say = Say() // あ” (イニシャライザが呼ばれる)
say.hello() // “い!!”
// “う” (デイニシャライザが呼ばれる)
}
call()
|
クラスのインスタンスを別の変数に代入すると参照が渡されます。インスタンスの参照数は参照カウントで管理されます。対して構造体を別の変数に代入すると新たなコピーが生成されます。構造体の参照先は常に1つなので参照カウントは使用されません。
構文
Structures are defined with a 'Struct' Keyword. struct nameStruct { Definition 1 Definition 2 --- Definition N }
構造の定義
3人の被験者のマークを含む生徒の記録にアクセスし、3人の被験者の合計を見つけなければならないと考える場合。ここでは、markStructは、3つのマークを持つ構造体をデータ型 ‘Int’として初期化するために使用する。
struct MarkStruct { var mark1: Int var mark2: Int var mark3: Int }
構造とそのプロパティへのアクセス
構造体のメンバーは構造体名でアクセスされます。構造体のインスタンスは ‘let’キーワードで初期化されます。
struct studentMarks { var mark1 = 100 var mark2 = 200 var mark3 = 300 } let marks = studentMarks() print("Mark1 is \(marks.mark1)") print("Mark2 is \(marks.mark2)") print("Mark3 is \(marks.mark3)")
次の結果が得られます。
Mark1 is 100 Mark2 is 200 Mark3 is 300
学生マークは、構造名 ‘studentMarks’によってアクセスされます。構造体メンバは、整数型の値を持つmark1、mark2、mark3として初期化されます。studentMarks()構造体は、 ‘let’キーワードで ‘marks’に渡されます。以降、 ‘marks’に構造体メンバ値が含まれます。値は ‘。’で構造体メンバの値にアクセスすることで出力されます。初期化された名前が付いています。
struct MarksStruct { var mark: Int init(mark: Int) { self.mark = mark } } var aStruct = MarksStruct(mark: 98) var bStruct = aStruct // aStruct and bStruct are two structs with the same value! bStruct.mark = 97 print(aStruct.mark) // 98 print(bStruct.mark) // 97
次の結果が得られます。
98 97
構造のベストプラクティスプラクティス
Swift 4言語は、機能ブロックを構築するためのカスタムデータタイプとして構造を定義する機能を提供しています。
- データ値をカプセル化する。
- カプセル化されたデータとそれに関連するプロパティを ‘references’ではなく ‘values’でコピーします。
- ‘コピー’と ‘参照’の構造。
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 } } var marks = markStruct(mark1: 98, mark2: 96, mark3:100) print(marks.mark1) print(marks.mark2) print(marks.mark3)
次の結果が得られます。
98 96 100
もう一つの例
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 } } var fail = markStruct(mark1: 34, mark2: 42, mark3: 13) print(fail.mark1) print(fail.mark2) print(fail.mark3)
私たちが上記のプログラムを遊び場で実行すると、次の結果が得られます。
34 42 13
構造体 ‘markStruct’は、メンバmark1、mark2、mark3で最初に定義されます。現在、メンバクラスの変数は整数値を保持するように初期化されています。
次に構造メンバーのコピーが ‘self’ Keywordで作成されます。構造体メンバのコピーが作成されると、そのパラメータマークを持つ構造ブロックが ‘marks’変数に渡され、これによって学生マークが保持されます。
次に、マークは98,96,100として印刷されます。同じ構造メンバーの次のステップでは、 ‘fail’という名前の別のインスタンスを使用して、同じ構造メンバーを異なるマークでポイントします。
次に、結果は34,42,13として出力されます。これは、構造体にメンバー変数のコピーがあり、次のファンクションブロックにメンバーを渡すことを明示しています