Edited at

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

More than 3 years have passed since last update.


はじめに

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


他の記事へのリンク


環境


  • Xcode 6.1 (Playground)


プロパティの初期化方法

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


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

  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 が自動的に割り当てられているので、イニシャライザ内で初期化する必要はない
//
}
}


参考文献

The Swift Programming Language