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

投稿者: | 2015年6月10日

3ヶ月表示を整えてみるの続きですが、実質プログラムの部分です。

前回載せなかった実行結果ですが、こんな感じになります。

threemonths2.swift実行結果

※今回もforループのところで警告が出ます。。。なんででしょう?

$ ./threemonths2.swift 
threemonths2.swift:20:13: warning: variable 'i' was never mutated; consider changing to 'let' constant
    for var i in 1..<endofmonth[components.month!]+1 {
        ~~~ ^
        let

今回は実質プログラムの前半部分、3ヶ月分のカレンダー計算結果の処理と年表示部分の処理を解説します。

let je_flag = 1
let now: Date = Date()
var cal_comp: DateComponents = getCalComp(date:now)
cal_comp.month!-=1
cal_comp.day! = 1
var sequence: [String] = []
var header: String = ""
var header_y: String = ""
var header_m: [String] = ["", "", ""]
for var i in 0..<3 {
    var calen: Date = Calendar.current.date(from:cal_comp)!
    cal_comp = getCalComp(date:calen)
    sequence += getCalendar(components:cal_comp)
    if i == 1 { header_y += "\(cal_comp.year!)" }
    header_m[i] = "\(cal_comp.month!)月"
    cal_comp.month!+=1
}

1行目は月表示部分で使うので、次回解説します。2から5行目はおさらいになりますが、今日の日付から先月の1日を算出するための下準備ですね。来月を表示してみるでは"+=1"だったところが"-=1"になっているだけです。

6から9行目はこれから使う変数や配列の宣言。sequence[]には曜日ヘッダ(日から土までの表示)を含む3ヶ月分のカレンダーのデータ147個が格納される予定です。headerには3ヶ月分まとめた月表示の文字列、header_yには年表示の文字列が入ります。header_m[]は各月の表示が格納されます。

10から17行目の3回のループで3ヶ月分の処理をします。11,12行目で各月1日のデータから各月のカレンダー配列を計算し、13行目で最初何も入っていなかったsequence[]配列に3ヶ月分のカレンダーを順に追記しています。

14行目はちょうど真ん中の月の年データだけをheader_yに代入しています。ほとんどの場合は3ヶ月とも同じ年になるはずですが、最初の月が12月の時と最後の月が1月の時だけ2年越しのカレンダーになるので、いちいち判定しなくてもいいように真ん中の月の年データを使用しています。

15行目で各月データを配列に代入したら、16行目で月送りをして先頭に戻ります。こうして3ヶ月分のカレンダーデータを格納したsequence[]をうまく横並びに表示するわけですが、それについては別項で。