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メソッドの使い方を忘れてしまったら、この記事を思い出してくださいね!