【Swift入門】初期化処理(init)の使い方を理解しよう!

こんにちは!フリーエンジニアのヤマシタです。

Swiftでは他のオブジェクト指向言語同様クラスの初期化処理を行うことができます。

この記事では、

・initメソッドとは
・initメソッドの基本的な使い方
・initメソッドで引数を指定する方法

というクラスの基本的な解説から、

・initメソッドを複数定義する方法
・構造体でinitメソッドを使用する方法

などの応用的な使い方に関しても解説していきます。

今回はそんな初期化処理(init)の使い方についてわかりやすく解説します!

※この記事ではSwift3.1を使用しています。

initメソッドとは

initメソッドとは、クラスのインスタンスを生成するときに自動で呼び出されるメソッドのことでイニシャライザとも呼びます。

initメソッドは主にクラスのプロバティの初期値を設定するときに使用します。

イニシャライザを使用することでクラスの記述内容がより分かりやすくなり、明確に初期化を行いソースコードの安全性を高めることができます。

なお、クラスについては以下の記事で解説していますので参考にしてください!

クラスをinitメソッドで初期化する

ここではinitメソッドの使い方を見ていきましょう。

基本的な使い方

以下にinitメソッドの基本的な使い方を紹介します。

サンプルプログラム

//クラスを定義
class SampleClass {
 
    //変数の定義
    var str1 = ""
    var str2 = ""
    
    //イニシャライザ
    init(){
        self.str1 = "Samurai"
        self.str2 = "Engineer"
    }
    
}
 
//インスタンスを生成
let cl = SampleClass()
 
//クラスの変数を参照
print(cl.str1)
print(cl.str2)

実行結果:

Samurai
Engineer

このサンプルではクラスSampleClassの中でプロパティの宣言と、initメソッドの中でプロパティの初期化を行っています。

処理の流れとしては、クラスの外でクラスのインスタンスを生成時に自動でinitメソッドが呼び出されます。

そして、クラスで宣言している2つの変数に対して、初期値を設定します。

initメソッドで設定した値はクラスの外から「クラスのオブジェクト.プロパティ名」を指定して参照することができます。

引数を指定する方法

initメソッドは引数を指定して初期化処理を行うこともできます。

サンプルプログラム1

//クラスを定義
class SampleClass {
 
    //変数の定義
    var sumval: Int = 0
    
    //イニシャライザ
    init(num1:Int, num2:Int){
        sumval = num1 + num2;
    }
    
}
 
//インスタンスを生成
let cl = SampleClass(num1:5, num2:10)
 
//クラスの変数を参照
print(cl.sumval)

実行結果:

15

このサンプルではnum1、num2の2つの変数をインスタンスの初期化時に必要なパラメータとして設定しています。

そのため、メソッドのパラメータには引数としてnum1、num2を指定する必要があります。

以下のようにインスタンス生成時のクラスの引数に値だけ指定するとエラーになりますので注意しましょう。

サンプルプログラム2

//クラスを定義
class SampleClass {
 
    //変数の定義
    var sumval: Int = 0
    
    //イニシャライザ
    init(num1:Int, num2:Int){
        sumval = num1 + num2;
    }
    
}
 
//インスタンスを生成
let cl = SampleClass(5, 10) //エラー
 

複数定義する方法

initメソッドは目的別に複数定義することもできます。

以下にInt型の値を初期設定するinitメソッドと、String型の値を初期設定するinitメソッドを定義するサンプルを紹介します。

サンプルプログラム

class SampleClass {
 
    //変数の定義
    var sumval: Int = 0
    var str: String = ""
    
    //イニシャライザ
    init(num1:Int, num2:Int){
        sumval = num1 + num2;
    }
    
    //イニシャライザ
    init(str1:String, str2:String){
        str = str1 + str2;
    }
    
}
 
//インスタンスを生成
let cl_1 = SampleClass(num1:5, num2:10)
let cl_2 = SampleClass(str1:"Samurai", str2:"Engineer")
 
//クラスの変数を参照
print(cl_1.sumval)
print(cl_2.str)

実行結果:

15
SamuraiEngineer

このように複数のinitメソッドを定義できることがわかりますね!

インスタンス生成時はそれぞれinitメソッドで定義した引数と一致する型と値を指定する必要がありますので気をつけてください。

構造体をinitメソッドで初期化する

initメソッドによる初期化処理はクラス以外にも構造体で使用することができます。

サンプルプログラム

struct SampleStruct {

  let sumval: Int
  
  //イニシャライザ
  init(num1:Int, num2:Int){
      self.sumval = num1 + num2
  }
}

//インスタンスを生成
let st = SampleStruct(num1:10, num2:20)
print(st.sumval)

実行結果:

30

このように構造体もinitメソッドを使用して初期化処理が行えることがわかりますね!

なお、構造体については以下の記事で詳しく解説していますのでぜひ参考にしてくださいね!

まとめ

ここではSwiftの初期化処理について、

・initメソッドとは
・initメソッドの基本的な使い方
・initメソッドで引数を指定する方法
・initメソッドを複数定義する方法
・構造体でinitメソッドを使用する方法

などについて解説しました。

クラスや構造体でinitメソッドを使うことにより、初期化処理を明確に記述することができますので積極的に活用するようにしましょう。

もしinitメソッドの使い方を忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

ヤマシタ

エンジニア歴10年のフリーランスエンジニア。ITに関わるさまざまなコンテンツの企画・制作も行っています。
ITに関してはノウハウ系、ライフハック系、トレンド系など、200本以上の執筆経験があります。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説