はじめに
この記事では、クラスのプロパティの初期化方法について説明します。
他の記事へのリンク
- [Swift] クラスのイニシャライザ1: イニシャライザの引数の書き方
- [Swift] クラスのイニシャライザ2: プロパティの初期化方法
- [Swift] クラスのイニシャライザ3: Designated Initializer と Convenience Initializer
- [Swift] クラスのイニシャライザ4: override 修飾子
- [Swift] クラスのイニシャライザ5: required 修飾子
- [Swift] クラスのイニシャライザ6: Failable Initializer
環境
- Xcode 6.1 (Playground)
プロパティの初期化方法
クラスのプロパティを初期化する方法は、2つあります。
- デフォルト値で初期化する方法
- イニシャライザ内で初期化する方法
1. デフォルト値で初期化する方法
イニシャライザの中ではなく、プロパティの宣言時にデフォルト値で初期化することができます。
1.1. 変数の場合
class Animal {
var name: String = "Initialization"
}
補足) デフォルト値の初期化タイミング
デフォルト値で初期化したプロパティには、イニシャライザの呼び出し時点で、すでに値が設定されています。
class Animal {
var name: String = "Initialization"
init() {
//
// イニシャライザの呼び出し時点で、すでにデフォルト値で初期化されている
//
println(self.name) // -> Initialization
}
}
var a = Animal()
1.2. 定数の場合
class Animal {
let name: String = "Initialization"
}
1.3. Optional 型の場合
Optional 型の場合は、初期値として nil
が自動的に割り当てられます。そのため、以下の2つのコードは同じ意味です。
class Animal {
var name: String?
}
class Animal {
var name: String? = nil
}
1.4. Implicitly Unwrapped Optional 型の場合
Implicitly unwrapped optional 型の場合も初期値が nil
です。そのため、以下の2つのコードは同じ意味です。
class Animal {
var name: String!
}
class Animal {
var name: String! = nil
}
2. イニシャライザ内で初期化する方法
2.1. 変数の場合
class Animal {
var name: String
init() {
self.name = "Initialization"
}
}
2.2. 定数の場合
定数の場合も、イニシャライザ内で初期化することができます。
class Animal {
let name: String
init() {
self.name = "Initialization"
}
}
注意1) 定数は Convenience Initializer の中では初期化できない
定数を初期化できるのは、designated initializer の中だけです。Convenience initializer の中では初期化できないので、注意してください。
class Animal {
let name: String
init() {
}
convenience init(name: String) {
self.init()
self.name = name // -> error: cannot assign to 'name' in 'self'
}
}
詳細は、[Swift] クラスのイニシャライザ3: Designated Initializer と Convenience Initializer の「8. 二段階の初期化処理」を参照してください。
注意2) 定数はインスタンスメソッドの中では初期化できない
また、インスタンスメソッドの中でも初期化できないので、注意してください。
class Animal {
let name: String
init() {
}
func initName() {
self.name = "Initialization" // -> error: cannot assign to 'name' in 'self'
}
}
注意3) 定数はサブクラスのイニシャライザ内では初期化できない
サブクラスのイニシャライザの中でも初期化できないので、注意してください。
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
が自動的に割り当てられます。そのため、イニシャライザ内で初期化する必要はありません.
class Animal {
var name: String?
init() {
//
// Optional 型はデフォルト値として nil が自動的に割り当てられているので、イニシャライザ内で初期化する必要はない
//
}
}
2.4. Implicitly Unwrapped Optional 型の場合
Implicitly unwrapped optional 型の場合も初期値は nil
です。そのため、イニシャライザ内で初期化する必要はありません.
class Animal {
var name: String!
init() {
//
// Implicitly unwrapped optional 型もデフォルト値として nil が自動的に割り当てられているので、イニシャライザ内で初期化する必要はない
//
}
}