Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 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

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