15.構造体2(イニシャライザ)

前回の構造体のおさらい

HTML
struct Apple{
    let kind = "ふじ"
    let place = "長野"
}

var a = Apple()
print (a.kind)
print (a.place)
構造体Appleをインスタンス化し、アクセスする
  • 構造体をAppleで作りました。
  • 中にプロパティをふたつ入れました。(kindとplace)
  • Apple()でインスタンス化、aに代入しています。aがインスタンスになりました。
  • インスタンス.プロパティ名でそれぞれにアクセスしています。

プロパティの値は後から決めることができる

前回の構造体は、最初からプロパティの「kind」と「place」に”ふじ”、”長野”という値が与えられています。(この値を初期値といいます。)しかし「プロパティの宣言時に値が決まっていない」「後から値を与えたい」ことが今後出てきます。そんな時は、初期値を省略して書くことができます。

ただ、注意すべきなのはインスタンス化するときにはプロパティの値は決まっていないといけないというルールが存在しています!

「プロパティの宣言時にまだ値が決まっていない」

「インスタンス化するにはどうすればいいか?」

それを解決してくれるのがイニシャライザです。

イニシャライザ

イニシャライザとは
  • イニシャライザとは、構造体{}の中のプロパティの値(初期値)が決まっていない状態を成立させるための処理のことです。
  • イニシャライザは「初期化」です。初期値のないものに値を作る作業をイニシャライザ(初期化)といいます。
  • イニシャライザを使用するとインスタンス化の時点で値を決めることができます。
  • 構造体{}内のプロパティの下にイニシャライザを定義していきます。
  • インスタンス化の時点で値を決めることができます。インスタンス化の時点で事前に決めておいた引数を使用します。

initはinitializerの4文字です。

init(①引数名:型名){
    self.プロパティ名 = 値(①と同じ引数)
}
self.プロパティ名

self.プロパティのselfの部分は仮のインスタンス名を指しています。

構造体{}の外から構造体{}内のプロパティにアクセスするときは、まずは{}の外でインスタンス化を行い、インスタンス.プロパティ名でアクセスをしました。

イニシャライザを定義する場所は構造体{}の中です。

構造体{}内で定義したイニシャライザは、同じく構造体{}内にあるプロパティにアクセスしたいとき、プロパティは構造体{}内にある、self.プロパティ、自身({}内にある)を指します。

struct Apple{
    let kind:String
    let place:String
    init(k:String,p:String){
        self.kind = k
        self.place = p
}

イニシャライザを書いた場合のインスタンス化の方法

構造体名(イニシャライザの引数群)
var a = Apple(k:"ふじ",p:"長野")

構造体Appleのプロパティで値を省略したためイニシャライザを使用した場合

struct Apple{
    let kind:String
    let place:String
    init(k:String,p:String){
        self.kind = k
        self.place = p
}
var a = Apple(k:"ふじ",p:"長野")
print(a.kind)
print(a.place)

イニシャライザを使った書き方が基本ですが、swiftではデフォルトでこのイニシャライザを省略できるメンバーワイズイニシャライザというものが用意されています。

例題のような単純な処理の場合はメンバーワイズイニシャライザを使って書くこともできます。

メンバーワイズイニシャライザ

メンバーワイズイニシャライザとは
  • swift側でデフォルトで用意されているイニシャライザです。
  • 例のような単純な処理の場合にinitの部分を省略しインスタンス化の時点で直接プロパティの値を指定できます。
  • 例のような単純な処理の場合にメンバーワイズイニシャライザが使用できます。
  • 構造体classでは使えません。
struct Apple{
    let kind:String
    let place:String
}
var a = Apple(kind:"ふじ",place:"長野")
print(a.kind)
print(a.place)

インスタンス化の時点で直接プロパティ名を指定しています。

構造体名(プロパティ名:値)
16.構造体3(メソッド)16.構造体3(メソッド)