Help us understand the problem. What is going on with this article?

イニシャライザについて(Swift)

イニシャライザについて

イニシャライザは型のインスタンスを初期化するための記法です。全てのストアドプロパティはインスタンス化の完了までに値が代入されていないと、初期化(インスタンス化)できないため、プロパティの宣言時(呼び出し時)に初期値を持たないプロパティは、イニシャライザ内で初期化してプロパティに値を与えることができます。

定義方法

普通のイニシャライザ

下記のコードを各型内(クラス、構造体、列挙体)で定義することで、利用できます。
イニシャライザはinitキーワードで宣言し、引数と初期化に関する処理を定義します。

init(引数) {
  初期化処理
}

サンプルコード

//構造体定義
struct Greeding {
  //ストアドプロパティ定義
   let to: String

  //コンピューテッドプロパティ定義
   var body: String{

   return "Hello, \(to)!"
   }
//インスタンス化時に渡されるtoの値をself.toで型のストアドに代入
   init(to: String) {
     self.to = to
   }
}

//インスタンス化時に型の引数に値の入ってないストアドプロパティの値を記述
let greeting = Greeting(to: "Yosuke Ishikawa")
let body = greeting.body

//結果
Hello, Yosuke Ishikawa!

上記のサンプルコードがイニシャライザの使用例です。
本来定義時に値を代入しておかなければいけないはずのストアドプロパティに値が設定されていません。
しかしその代わりinitでイニシャライザを定義することで、インスタンス化時に渡される値をself.toで自身のtoに代入しています。
このおかげで実行結果も正しく出力されました。

失敗可能なイニシャライザ

イニシャライザは全てのプロパティを正しい型の値で初期化しますが、インスタンス化時に渡される引数次第では初期化できないケースが発生します。もちろんその場合はコンパイルエラーになります。
そこで初期化の失敗も加味した、失敗可能イニシャライザ(failable initializer)を使用します。
失敗可能イニシャライザはinitに?を加えinit?(引数)という形で定義します。
それでは早速実装コードを見てみましょう。

サンプルコード

//構造体定義
struct Item {
 //ストアドプロパティ定義
  let id: Int
  let title: String

 //失敗可能イニシャライザ定義
  init?(dictionary: [String: Any]) {
     guard let id = dictionary["id"] as? Int,
           let title = dictionary["title"] as? String else {
           return nil
      }
      self.id = id
      self.title = title
   }
}

let dictionaries: [String: Any] = [
    ["id": 1, "title": "abc"],
    ["id": 2, "title": "def"],
   //idがない!
    ["title": "ghi"],
]

for dictionary in dictionaries {
    if let item = Item(dictionary: dictionary) {
       print(item)
    } else {
       print("エラー: 辞書\(dictionary)からItemを出力できませんでした")
    }
}

//結果
Item(id: 1, title: "abc")
Item(id: 2, title: "def")
エラー:辞書["title": "ghi"]からItemを生成できませんでした

上記のコードを見ると、失敗可能イニシャライザが定義している内部でguard文が定義されています。ここでは詳しい解説は省きますが、guard文とはfalseの場合に処理を行う文です。そのため、条件のidとtitleがない場合はnilを返します。それ以外のtrueの場合は通常通りselfを用い、自身のidとtitleに引数で指定された値を代入します。
その結果、実行結果は3つ目の結果だけidがないためエラー文が出力されます。

注意点

プロパティの初期化はコンパイラによってチェックされています。そのため、一つでも初期化されていないプロパティがある場合は、型の整合性が取れなくなってしまうためコンパイルエラーとなるので注意が必要です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした