イニシャライザ
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チャレンジ
簡単クラス 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())
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Swiftプレイグラウンド