3ヶ月表示を整えてみる(3)

投稿者: | 2015年6月12日

前回3ヶ月分のカレンダーのデータを用意できたので、今回はこれを表示してみます。

var length: Int = (65 - header_y.characters.count) / 2
for var i in 0..<length+1 {
    header_y = " " + header_y
}
print("\(header_y)\n")
for var i in 0..<3 {
    length = (21 - (header_m[i].characters.count + je_flag)) / 2
    for var j in 0..<length {
        header_m[i] = " " + header_m[i]
    }
    length = 22 - (header_m[i].characters.count + je_flag)
    for var j in 0..<length {
        header_m[i] = header_m[i] + " "
    }
    header += header_m[i]
}
print(header)
for var i in 0..<7 {
    for var j in 0..<3 {
        for var k in 0..<7 {
            print("\(sequence[i * 7 + (j * 49 + k)]) ", terminator:"")
        }
        print(" ", terminator:"")
    }
    print("")
}

まずは年表示から。cal -3の表示フォーマットは1行目が今月の年、2行目が3ヶ月分の月、以降日付の羅列となっています。

1から4行目で年表示をセンタリングして5行目でこれを表示しています。”.characters.count”は指定文字列の文字数を数える命令です。1か月分の横幅は半角21文字分で各月の間を半角1文字の空白で区切っているので、3ヶ月分の表示幅は半角65文字分。ここからheader_yの文字数分引いた数の半分の空白を年表示の前においてやると完成。

次に月表示。考え方は年表示と同じですが、月ごとにセンタリングしたものを最後に連結しますので、各header_m[]の後ろ側にも空白を入れてやらないとずれてしまいます。6から16行目でこの処理をおこなって、17行目で表示しています。前半部分の7から10行目が月表示の前側の空白、11から14行目が月表示の後側の空白を挿入していて15行目でheaderに3ヶ月分の結果を連結しています。

なお”.characters.count”は文字数を数えますが日本語フォントは半角2文字分を使うので、月表示については”.characters.count”の結果に対し+1の補正をしないと表示がずれます。これをおこなっているのが7,11行目の”+ je_flag”です。前回の1行目に

je_flag = 1

と指定しているので結果的に”+1″になります。

最後に3ヶ月分の日付表示が18から26行目まで。sequence[]には先頭から49個づつ先月、今月、来月の日付が順番に格納されていますが、表示はこれを横並びにしなくてはいけません。1行づつ分解して考えると、先頭から7個づつ先月、今月、来月と表示することになります。

20から22行目、変数kを使って回しているのが、各月の7個のデータを一つづつ表示する部分です。print(“hoge”, terminator:””)命令で改行を抑制しているので、7個のデータは空白ひとつで区切られて横並びに表示されます。

19,23,24行目が変数jを使ってこれを3ヶ月分繰り返すところ。そして18,25,26行目が変数iを使って7行分(曜日行に加えて6週分)の表示をするところです。これで完成。