完了を記録する
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 34/56。
最初の機能: 「この日にこの習慣を完了としてマークする」というアクションのリストを処理し、最終的な状態を生成します。
各入力行は、habit:day 形式の1つの操作です。ここで、day は 1 から 7 の間の値です。その習慣がまだ存在しない場合は、空の配列で作成し、その日を追加します。その習慣にすでにその日が記録されている場合は、2回記録しないでください。
辞書の章で紹介したデフォルト値付きサブスクリプト(default-subscript)のパターンを利用します。habits[name, default: []].append(day) は、キーが存在するかどうかにかかわらず動作します。
チャレンジ
簡単1行の入力を読み込みます。それはカンマで区切られた habit:day エントリのリストです(例:read:1,read:3,workout:2)。すべての操作を適用した後、習慣をアルファベット順に、1行に1つずつ、以下の形式で出力してください:
<habit>: <days_sorted_ascending_joined_with_comma>重複する habit:day のペアはスキップしてください。
入力 read:1,read:3,workout:2,read:1,read:5,workout:4 に対して、出力は以下の通りです:
read: 1,3,5
workout: 2,4チートシート
default-subscriptパターンを使用して、配列の辞書に要素を追加します。キーが存在しない場合は作成されます:
var habits: [String: [Int]] = [:]
habits[name, default: []].append(day)
重複を避けるには、追加する前に確認します:
if !habits[name, default: []].contains(day) {
habits[name, default: []].append(day)
}
自分で試してみよう
var habits: [String: [Int]] = [:]
let ops = readLine()!.components(separatedBy: ",")
// TODO: 各操作について、name:dayを解析し、まだ存在しない場合はdayを追加します。
// その後、ソートされた日付とともに習慣をアルファベット順に表示します。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。