Menu
CoddyTech

初始化方法

本课属于 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 和一个可选的 balance,默认值为 0,并保存这两个值。然后完成 summary(),它会返回 Ada has 150。

提供的代码会读取所有者,如果存在第二行,还会读取初始余额。它会创建带余额或不带余额的账户,并打印 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 在线编辑器