每周网格
本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 36 课,共 56 课。
现在该打印日历了。对于每个习惯,渲染一个由 7 个字符组成的网格,完成的日期用 X 表示,其他日期用 . 表示。
// days = [1, 3, 5]
// 渲染结果:X.X.X..实用技巧:先把网格构建为字符数组,然后只将它转换为一次 String。
var slots = Array(repeating: ".", count: 7)
for d in days {
slots[d - 1] = "X"
}
let row = slots.joined()days 的索引从 1 开始(周一 = 1),但 Swift 数组的索引从 0 开始,因此赋值时要减去 1。超出范围的日期会导致程序崩溃,所以请相信输入格式。
挑战
中等读取一行输入:以逗号分隔的 habit:day 条目列表。像之前一样构建字典,然后按字母顺序排序,每个习惯打印一行,格式如下:
<habit> |<grid>| <count>其中,grid 是由七个字符组成的 X/. 字符串,count 是该习惯已完成的不同日期数量。
对于输入 read:1,read:3,read:5,workout:2,workout:4,输出为:
read |X.X.X..| 3
workout |.X.X...| 2亲手试试
var habits: [String: [Int]] = [:]
let ops = readLine()!.components(separatedBy: ",")
for op in ops {
let parts = op.components(separatedBy: ":")
let day = Int(parts[1])!
if !(habits[parts[0], default: []].contains(day)) {
habits[parts[0], default: []].append(day)
}
}
// TODO:为每个习惯创建一个包含 7 个位置的网格;输出 '<name> |<grid>| <count>'
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Swift 在线编辑器