Menu
CoddyTech

图书和成员

本课属于 Coddy Swift 学习旅程的“面向对象编程”单元。第 50 课,共 57 课。

在这个项目中,你将构建图书馆系统的核心。Library 类接收命令,每行一条,并逐条回复。通过 5 个步骤,它将学会添加图书和会员、借出和归还图书、搜索目录以及打印报告。

ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT

这个数据模型使用了本单元的工具。Book 是一个结构体:它的值会随 borrower 的变化而变化。Member 是一个类,因为图书馆和成员的借阅列表都引用同一个人。图书馆将这两者都保存在私有字典中,因此只有它的方法才能修改它们:

struct Book {
    let id: Int
    let title: String
    var borrower: String? = nil
    var isAvailable: Bool { borrower == nil }
}

var books: [Int: Book] = [:]
books[1] = Book(id: 1, title: "Dune")
books[1]!.borrower = "ada"
print(books[1]!.isAvailable)

输出:

false

handle(_:)会拆分命令,并根据第一个单词进行分支处理。每个分支都会以数组的形式返回回复,因此像 REPORT 这样的命令可以回复多行内容。书名可以包含空格,所以它是 id 之后的所有内容:

let p = "ADD_BOOK 7 The Hobbit".split(separator: " ").map(String.init)
let id = Int(p[1])!
let title = p.dropFirst(2).joined(separator: " ")
print("\(id): \(title)")

输出:

7: The Hobbit
challenge icon

挑战

简单

完成 Library.handle(_:) 中前两个命令的处理:

  • ADD_BOOK <id> <title>:存储一本新的可借阅图书,并回复 added book 1: Dune;如果该 id 已被占用,则回复 book 1 exists。
  • JOIN <name>:添加一名成员,并回复 welcome ada;如果该姓名已存在,则回复 ada is already a member。

提供的代码会将每一行输入传给 library.handle(_:),并将每条返回的回复单独打印在一行上。成员姓名由一个小写单词组成,图书 id 是整数,输入中只有目前所述的命令。对于任何其他命令,回复 unknown command。

你的代码应写在 Book.swift、Member.swift 和 Library.swift 中。main.swift 中包含提供的输入/输出代码,不能编辑。

亲手试试

// 提供的输入/输出代码:保持原样
var input: [String] = []
while let line = readLine() { input.append(line) }
let library = Library()
for line in input {
    for reply in library.handle(line) { print(reply) }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Swift 在线编辑器