Menu
Coddy logo textTech

イニシャライザ

CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 4/57。

イニシャライザ(init と記述)はインスタンスが作成されるときに実行され、プロパティに初期値を設定します。そのパラメータは、型の呼び出し時の引数になります。

class Book {
    var title: String
    var pages: Int

    init(title: String, pages: Int) {
        self.title = title
        self.pages = pages
    }
}

let book = Book(title: "Dune", pages: 412)
print(book.title)
print(book.pages)

出力:

Dune
412

インスタンスを使用する前に、すべてのプロパティに値が必要です。デフォルト値のないプロパティはinitで設定する必要があり、そうしないとクラスはコンパイルできません。letで宣言されたプロパティは、initで一度設定でき、その後は変更できません。

class Book {
    let isbn: String     // init で一度だけ設定
    var title: String

    init(isbn: String, title: String) {
        self.isbn = isbn
        self.title = title
    }
}

initのパラメータにはデフォルト値を設定できるため、呼び出し側は異なる値だけを指定します:

class Timer {
    var seconds: Int
    var label: String

    init(seconds: Int, label: String = "timer") {
        self.seconds = seconds
        self.label = label
    }
}

let egg = Timer(seconds: 300, label: "egg")
let quick = Timer(seconds: 30)
print("\(egg.label) \(egg.seconds)")
print("\(quick.label) \(quick.seconds)")

出力:

egg 300
timer 30

クラスには、パラメーターが異なる複数のイニシャライザーを持たせることができます。convenience initは一部の値を補い、self.init(...)を使ってメインのイニシャライザーを呼び出します。

class Temperature {
    var celsius: Double

    init(celsius: Double) {
        self.celsius = celsius
    }

    convenience init(fahrenheit: Double) {
        self.init(celsius: (fahrenheit - 32) * 5 / 9)
    }
}

print(Temperature(celsius: 20).celsius)
print(Temperature(fahrenheit: 212).celsius)

出力:

20.0
100.0
challenge icon

チャレンジ

簡単

クラス Account のイニシャライザを記述してください。owner と、デフォルト値が 0 の省略可能な balance を受け取り、両方を格納します。次に、Ada has 150 を返す summary() を完成させてください。

提供されたコードは owner を読み取り、2 行目がある場合は開始残高も読み取ります。残高を指定して、または指定せずにアカウントを作成し、summary() を出力します。

コードは Account.swift に記述してください。main.swift には提供された入出力コードが含まれており、編集できません。

自分で試してみよう

// 提供された入出力コード: そのままにしておく
var input: [String] = []
while let line = readLine() { input.append(line) }
let account = input.count > 1 ? Account(owner: input[0], balance: Int(input[1])!) : Account(owner: input[0])
print(account.summary())
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Swiftプレイグラウンド