スウィフト – 構造

スポンサーリンク

本当にわからないとこがあった場合一人では解決できません。
『teratail』とはエンジニア特化型のQ&Aサイトです。 すべてのエンジニアさんが抱えている悩みを共有して 解決するための質問サイトです
無料なのでまずは登録して使ってみてください。メールアドレスだけで登録可能です ----------------------------------------------------------------------------------------


スウィフト – 構造


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として出力されます。これは、構造体にメンバー変数のコピーがあり、次のファンクションブロックにメンバーを渡すことを明示しています

前のページ 次のページ









スポンサーリンク

プログラミングは独学からは挫折の可能性が高いです。まずは無料体験ができる
コードキャンプが本当におすすめ。無料体験でわからないところを聞きましょう。
転職補助つき。カリキュラム終了後に転職紹介をしてくれます。