Swift

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

More than 1 year has 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