8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

イニシャライザとは

Last updated at Posted at 2017-09-01

どういう時に使う?

イニシャライザはinitという名の特別なメソッドで、構造体クラスで初期化のために使用します。
インスタンスを生成するときに呼び出される為、インスタンス毎に異なる値を使って実装したい時に使う

使用例

・以下だと「社員番号」「名前」「担当」に値が入ってないのでコンパイルでエラーが出る

社員クラス 
class Employee {
    let id:Int        //社員番号
    let name:String   //名前
    let tantou:String //担当

    //注文を受ける
    func reciveOrder() -> Bool{
         return true
    }
}

・そこで、以下のコードのようにプロパティの宣言と同時に値を設定すればエラーは発生しなくなる。社員番号、名前、担当はインスタンスごとに値を変える必要があるので、未設定を意味するような値を設定しておく。

社員クラス
class Employee {
    var id:Int = 0 //社員番号
    var name:String = "無し" //名前
    var tantou:String = "無し" //担当
 
    //注文を受ける
    func reciveOrder() -> Bool{
         //とりあえず処理は省略
         return true
    }
}

・インスタンスの生成は下記でできるが、毎回プロパティ値を初期化するために何行も記述しなければならずまた、初期化後に変更しない値を変数(var)で宣言しなければならないため、プロパティ値が思わぬところで変更されないよう今後のコーディングで注意する必要が出てくる

インスタンスを生成
var employee1 = Employee()
employee1.id = 1054
employee1.name = "佐藤"
employee1.tantou = "ホールスタッフ"
 
 
var employee2 = Employee()
employee2.id = 3672
employee2.name = "広田"
employee2.tantou = "キッチンスタッフ"

そこで、利用するのがイニシャライザでインスタンスを生成するときに呼び出されるinitメソッドのことである。イニシャライザの中でプロパティ値を設定すれば、プロパティを宣言すると同時に値を代入しなくても良くなる。

例えば、以下のコードのように、init(社員番号, 名前, 担当)というメソッドを定義しておけば、社員クラスのインスタンスを生成するときに必ず社員番号, 名前, 担当を引数に与えることになる。

社員クラス
class Employee {
    let id:Int        //社員番号
    let name:String   //名前
    let tantou:String //担当
 
    //イニシャライザ
    init(id:Int, name:String, tantou:String){
        //引数の値をインスタンスの変数に代入する
        self.id = id
        self.name = name
        self.tantou = tantou
    }
 
    //注文を受ける
    func reciveOrder() -> Bool{
         //とりあえず処理は省略
         return true
    }
}
 
//社員クラスのインスタンスを生成
var employee1 = Employee(id:1054, name:"佐藤", tantou:"ホールスタッフ")
var employee2 = Employee(id:3672, name:"広田", tantou:"キッチンスタッフ")
 

補足

Objective-Cのイニシャライザは生成したインスタンスを返す必要がありますが、Swiftの場合は何も返しません。

構造体とクラスのイニシャライザの書き方は基本的に同じですが、それぞれで気をつけるところがあるのでそれらについて以下で説明します。

構造体
/* パーソン */

struct Person {

    var name: String    // 名前
    var age: Int        // 年齢

    // イニシャライザ
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}
let person = Person(name:"タロウ", age: 18)

イニシャライザは上の様に関数と違い、initの前にfuncは不要です。また、引数の内部名は自動的に外部名となり(関数で内部名に#をつけたのと同じ)、インスタンスの生成時に引数のラベルをつける必要があります。

※swift3では関数ラベルの扱いが func も init も同じ、暗黙的なラベルがつけられ、ラベルが要らない時は明示的に書く必要があります

構造体の場合は、イニシャライザを記述しないと、プロパティ値を引数にとるイニシャライザ(Memberwise Initialization:メンバワイズイニシャライザといいます。)を自動的に生成してくれます。

8
12
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?