Timepiece 1.0.0をリリースした

最初のバージョンはSwiftが出た2014年だった。それ以降、細かな機能追加やバグ修正を繰り返し、0.5.0でSwift 2.3、0.6.0でSwift 3に対応した。どこかのタイミングで多くのStar、issueがつくようになり、多くのユーザーが使ってくれるようになった。

そして昨日、ようやく安定版となる1.0.0をリリースした。1.0.0では破壊的な変更を行った。

メソッド名の変更

// 0.6.0
Date.date(year: 2016, month: 10, day: 31)
"2016-10-31T12:00:00+0900".dateFromFormat("yyyy-MM-dd'T'HH:mm:ssZ")

// 1.0.0
Date(year: 2016, month: 10, day: 31)
"2016-10-31T12:00:00+0900".date(inFormat: "yyyy-MM-dd'T'HH:mm:ssZ")

よりSwiftらしく、またSwift 3の命名規則に沿ったものに変更した。

タイムゾーンのサポートをやめた

個別の日付オブジェクトについてタイムゾーンをサポートするようにしていたが、バグになりかねない部分であり、後述するメンテナンスコストを下げていく方針に合わないため、この機能を削除した。

Durationの内部表現を変更した

これまでのバージョンでは、期間を表す概念としてDurationというstructを用意していたが、これをやめた。本来、期間を表す概念としてDateComponentsというものがあるため(これまでDateComponentsが期間を表すということをちゃんと認識してなかった)、これを最大限利用した。この変更によって、1.0.0では新たに以下のような計算や処理が可能になった。

// 1.0.0
Date() + (3.hours - 30.minutes)
(3.hours - 30.minutes).string(in: .abbreviated) //=> "2h 30m"

固定フォーマットでの出力をやめた

// 0.6.0
1.weeks.later.stringFromFormat("yyyy/MM/dd")

上のようなメソッドをやめた。DateFormatterで簡単に実装できるが、この機能は暦やロケールを考慮していない実装なのであまりオススメできない。その代わりにDateFormatter.Styleを指定して出力できるようにした。

// 1.0.0
1.weeks.later.dateString(in: .short)

望ましい機能は実装しやすくする。望ましくない機能は実装しにくくする。というのが理想的なAPIインターフェイスであるように思う。

変更の背景

OSSにかけられる時間が減った。メンテナンスコストを下げたかった。バグが出やすい機能はできるだけ削った。機能が豊富な日付操作ライブラリは他にもある。そんな中、最小限の機能でバグがなく正確で少し読めば何をしているか分かるようなライブラリが理想的だとおもった。