分割コンパイル

投稿者: | 2016年2月10日

さて、前々回作ったクラスも前回作ったテストプログラムも、単体ではうまく動きません。これらを結合してコンパイルするためには以前紹介したコンパイルコマンドに対し、複数のファイル名を渡す必要があります。

この時の注意点としてはメインプログラムのソースファイル名がmain.swift固定であることです。それ以外は受け付けません。そこで前回作ったテストコードをmain.swiftにしてクラスファイルcheckOption.swiftとともにコンパイルしてみます。

$ xcrun -sdk macosx swiftc -o test-chkopt main.swift checkOption.swift
$ ./test-chkopt
["no-option"]
Raws:1, Cols:1, WeekFormat:false, StartYear:0, StartMonth:0
["current-year", "-y"]
Raws:4, Cols:3, WeekFormat:false, StartYear:0, StartMonth:1
["specified-year", "-y", "2016"]
Raws:4, Cols:3, WeekFormat:false, StartYear:2016, StartMonth:1
["current-month", "-m"]
Raws:1, Cols:1, WeekFormat:false, StartYear:0, StartMonth:0
["specified-month", "-m", "2"]
Raws:1, Cols:1, WeekFormat:false, StartYear:0, StartMonth:2
["specified-month-and-year", "-m", "2", "2016"]
Raws:1, Cols:1, WeekFormat:false, StartYear:2016, StartMonth:2
["current-month-and-befor-after", "-3"]
Raws:1, Cols:3, WeekFormat:false, StartYear:0, StartMonth:-1
["three-month-from-current", "+3"]
Raws:1, Cols:3, WeekFormat:false, StartYear:0, StartMonth:0
["current-week", "-w"]
Raws:1, Cols:1, WeekFormat:true, StartYear:0, StartMonth:0
["error", "-x"]
Raws:0, Cols:0, WeekFormat:false, StartYear:0, StartMonth:0

うまく動いているようです。これでメインプログラムからオプションスイッチチェック部分を切り離すことができました。

#! /usr/bin/swift
import Foundation
let testArguments: [(args:[String], raws:Int, cols:Int, week:Bool, year:Int, month:Int)] =
    [(["no-option"], 1, 1, false, 0, 0),
    (["current-year", "-y"], 4, 3, false, 0, 1),
    (["specified-year", "-y", "2016"], 4, 3, false, 2016, 1),
    (["current-month", "-m"], 1, 1, false, 0, 0),
    (["specified-month", "-m", "2"], 1, 1, false, 0, 2),
    (["specified-month-and-year", "-m", "2", "2016"], 1, 1, false, 2016, 2),
    (["current-month-and-befor-after", "-3"], 1, 3, false, 0, -1),
    (["three-month-from-current", "+3"], 1, 3, false, 0, 0),
    (["current-week", "-w"], 1, 1, true, 0, 0),
    (["error", "-x"], 0, 0, false, 0, 0)]
for var i in 0..<testArguments.count {
    print("\(testArguments[i].args) ", terminator:"")
    var chkopt = checkOption(arguments: testArguments[i].args)
    if ((testArguments[i].raws == chkopt.getCalendarRaws()) &&
        (testArguments[i].cols == chkopt.getCalendarCols()) &&
        (testArguments[i].week == chkopt.getWeekFormat()) &&
        (testArguments[i].year == chkopt.getStartYear()) &&
        (testArguments[i].month == chkopt.getStartMonth())) {
        print("\u{001B}[0;32m==> OK\u{001B}[0;30m")
    } else {
        print("\u{001B}[0;37;41m==> NG\u{001B}[0;30m")
    }
    print("Raws:\(chkopt.getCalendarRaws()), ", terminator:"")
    print("Cols:\(chkopt.getCalendarCols()), ", terminator:"")
    print("WeekFormat:\(chkopt.getWeekFormat()), ", terminator:"")
    print("StartYear:\(chkopt.getStartYear()), ", terminator:"")
    print("StartMonth:\(chkopt.getStartMonth())")
}

ついでに結果の自動判定を入れてみました。テスト条件と同時に期待する結果を与えることで、実行結果と照合して正しければグリーンで「==> OK」を、間違っていればレッドで「==> NG」を表示するようにしました。

テスト実行結果

当然テスト条件と期待する結果とを正しく与えることが大前提ですが、ここでタプルというデータ形式を採用することでテスト条件と期待する結果を隣接させることで入力ミスを減らしています。

タプルは以前英語対応カレンダーで値の整理をした時に特に説明もなくしれっと使っていたりしますが、ここで改めて解説。

配列とすごく似てるけど配列と違って各要素のデータ型が違っていても構わない。

これだけ。配列は[]で括りますがタプルは()で括ります。そして配列は添字でアクセスしますが、タプルは各要素にラベルをつけて名前でアクセスできます。細かくはいろいろあるみたいですが、今のところこんな理解で大丈夫っぽい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です