[Swift] クラスのイニシャライザ２： プロパティの初期化方法

# はじめに

この記事では、クラスのプロパティの初期化方法について説明します。


# 他の記事へのリンク

* [[Swift] クラスのイニシャライザ１： イニシャライザの引数の書き方](http://qiita.com/cotrpepe/items/bfebe21e9f75c1fce60c)
* [[Swift] クラスのイニシャライザ２： プロパティの初期化方法](http://qiita.com/cotrpepe/items/db842f74b4c8ce16052c)
* [[Swift] クラスのイニシャライザ３： Designated Initializer と Convenience Initializer](http://qiita.com/cotrpepe/items/3052d91468f1b852582a)
* [[Swift] クラスのイニシャライザ４： override 修飾子](http://qiita.com/cotrpepe/items/8d197a9a288eb24c19fb)
* [[Swift] クラスのイニシャライザ５： required 修飾子](http://qiita.com/cotrpepe/items/3931c0c20ef43f4a18ac)
* [Swift] クラスのイニシャライザ６： Failable Initializer


# 環境

* Xcode 6.1 (Playground)


# プロパティの初期化方法

クラスのプロパティを初期化する方法は、２つあります。

1. デフォルト値で初期化する方法
2. イニシャライザ内で初期化する方法


# 1. デフォルト値で初期化する方法

イニシャライザの中ではなく、プロパティの宣言時にデフォルト値で初期化することができます。

## 1.1. 変数の場合

```swift
class Animal {
    var name: String = "Initialization"
}
```

### 補足） デフォルト値の初期化タイミング

デフォルト値で初期化したプロパティには、イニシャライザの呼び出し時点で、すでに値が設定されています。

```swift
class Animal {
    var name: String = "Initialization"
    
    init() {
        //
        // イニシャライザの呼び出し時点で、すでにデフォルト値で初期化されている
        //
        println(self.name) // -> Initialization
    }
}

var a = Animal()
```


## 1.2. 定数の場合

```swift
class Animal {
    let name: String = "Initialization"
}
```

## 1.3. Optional 型の場合

Optional 型の場合は、初期値として `nil` が自動的に割り当てられます。そのため、以下の２つのコードは同じ意味です。

```swift
class Animal {
    var name: String?
}
```

```swift
class Animal {
    var name: String? = nil
}
```

## 1.4. Implicitly Unwrapped Optional 型の場合

Implicitly unwrapped optional 型の場合も初期値が `nil` です。そのため、以下の２つのコードは同じ意味です。

```swift
class Animal {
    var name: String!
}
```

```swift
class Animal {
    var name: String! = nil
}
```

# 2. イニシャライザ内で初期化する方法

## 2.1. 変数の場合

```swift
class Animal {
    var name: String

    init() {
        self.name = "Initialization"
    }
}
```

## 2.2. 定数の場合

定数の場合も、イニシャライザ内で初期化することができます。

```swift
class Animal {
    let name: String

    init() {
        self.name = "Initialization"
    }
}
```


### 注意１） 定数は Convenience Initializer の中では初期化できない

定数を初期化できるのは、designated initializer の中だけです。Convenience initializer の中では初期化できないので、注意してください。

```swift
class Animal {
    let name: String
    
    init() {
    }
    
    convenience init(name: String) {
        self.init()
        self.name = name // ->  error: cannot assign to 'name' in 'self'
    }
}
```

詳細は、[[Swift] クラスのイニシャライザ３： Designated Initializer と Convenience Initializer](http://qiita.com/cotrpepe/items/3052d91468f1b852582a) の「8. 二段階の初期化処理」を参照してください。


### 注意２） 定数はインスタンスメソッドの中では初期化できない

また、インスタンスメソッドの中でも初期化できないので、注意してください。

```swift
class Animal {
    let name: String
    
    init() {
    }
    
    func initName() {
        self.name = "Initialization" // -> error: cannot assign to 'name' in 'self'
    }
}
```

### 注意３） 定数はサブクラスのイニシャライザ内では初期化できない

サブクラスのイニシャライザの中でも初期化できないので、注意してください。

```swift
class Animal {
    let name: String
    
    init() {
    }
}

class Cat: Animal {
    override init() {
        self.name = "Initialization" // -> error: cannot assign to the result of this expression
    }
}
```

## 2.3. Optional 型の場合

Optional 型の場合は、初期値として `nil` が自動的に割り当てられます。そのため、イニシャライザ内で初期化する必要はありません.

```swift
class Animal {
    var name: String?

    init() {
        //
        // Optional 型はデフォルト値として nil が自動的に割り当てられているので、イニシャライザ内で初期化する必要はない
        //
    }
}
```


## 2.4. Implicitly Unwrapped Optional 型の場合

Implicitly unwrapped optional 型の場合も初期値は `nil` です。そのため、イニシャライザ内で初期化する必要はありません.

```swift
class Animal {
    var name: String!

    init() {
        //
        // Implicitly unwrapped optional 型もデフォルト値として nil が自動的に割り当てられているので、イニシャライザ内で初期化する必要はない
        //
    }
}
```

# 参考文献

[The Swift Programming Language](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-XID_306)