【Swift4】DateManager【iOS】

日付操作支援クラスです。まだまだ見た目がイケてなかったりしますがとりあえずリリース。

github => [DateManager](https://github.com/fromageblanc/DateManager)

## Requirements
- iOS 9 and later
- Swift 4.0 and Later

## 備考
- 今のところポップアップカレンダーに関してはポートレイトのみサポートです。
- リファクタリング前であり強制アンラップ箇所がいくつかあります。

## インストール
DateManager.swiftの１ファイルをプロジェクトに追加するだけです。
[github](https://github.com/fromageblanc/DateManager)からどうぞ。

## 使い方

- インスタンスの際、日付情報を指定します。日付情報はDate型かString型(RFC3339) で指定します。

```swift
let dm = DateManager(base:Date())
let dm2 = DateManager(base:"2018-04-10T01:00:00Z")
```

- 年、月、日、曜日、時間、分、秒、個別の取得が可能です。

```swift
print(dm.baseDate.toStringWithCurrentLocale())
        
print(dm.getYear()!)
print(dm.getMonth()!)
print(dm.getDay()!)
print(dm.getWeek()!)
print(dm.getWeekJ()!)
print(dm.getHour()!)
print(dm.getMinute()!)
print(dm.getSecond()!)

/* output
2018-01-09 18:23:51
2018
1
9
Tuesday
火曜日
18
23
51
*/
```

- 日付の操作ができます。名前が"add"で始まるメソッドは算出後の日付により生成されたDateManagerのインスタンスを返しますので、メソッドチェーンを利用できます。


```swift
let dm = DateManager(base:Date())

let date1 = dm.addMonth(1).toString()
let date2 = dm.addYear(-2).addMonth(3).toString()
let date3 = dm.addDay(2).addYear(10).addWeek(3).toString(style:["dateStyle":.full])
```

- 基準日(baseDateプロパティ)が属す月のカレンダーデータを作成できます。

```swift
let calComps = dm.createCalendarComponents()
print(dm.baseDate)
print(calComps.targetMonth)
print(calComps.date)
print(calComps.weekJ)

/* output
2018-01-09 08:54:26 +0000
2018.01
["2018-01-01", "2018-01-02", "2018-01-03", "2018-01-04", "2018-01-05", "2018-01-06", "2018-01-07", "2018-01-08", "2018-01-09", "2018-01-10", "2018-01-11", "2018-01-12", "2018-01-13", "2018-01-14", "2018-01-15", "2018-01-16", "2018-01-17", "2018-01-18", "2018-01-19", "2018-01-20", "2018-01-21", "2018-01-22", "2018-01-23", "2018-01-24", "2018-01-25", "2018-01-26", "2018-01-27", "2018-01-28", "2018-01-29", "2018-01-30", "2018-01-31", "2018-02-01", "2018-02-02", "2018-02-03", "2018-02-04"]
["月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日"]
*/
```

カレンダーデータ(CalendarComponents)のデータ構造

```swift
var date:[String]           // 日付
var full:[String]           // 日付情報(フルフォーマット)
var fullJ:[String]          // 日付情報(ja/フルフォーマット)
var day:[String]            // 日
var week:[String]           // 曜日(英語)
var weekJ:[String]          // 曜日(日本語)
var month:[String]          // 月(英語)
var monthJ:[String]         // 月(日本語)
var year:[String]           // 年
var numberOfWeek:[Int]      // 第N週
var targetMonth:String      // カレンダー対象月
var targetYear:Int          // カレンダー対象年
var gengou:String           // カレンター対象元号
var numberOfWeeks:Int       // 週数
var numberOfCells:Int       // マス数
var previousMonth:String    // 前月
var nextMonth:String        // 翌月
```

- ポップアップカレンダー呼び出し

```swift
// デリゲートを設定
dm.popupCalendarDelegate = self

// ポップアップカレンダーを表示
dm.popupCalendar(completion: { () in
    // 表示後に何か処理をする場合ここに書く
})
```

カレンダーセル選択時の処理を定義

```swift
// PopupCalendarDelegateを批准し、calendarSelected()を定義
extension YourViewController:PopupCalendarDelegate {
    func calendarSelected(_ data: PopupCalendarCell,calendar:UICollectionView) {
        
        // your operation
        
        // calendar close. ** don't call removeFromSuperview! **
        //calendar.close()
    }
}

```

### Sample

![dm2.gif](https://qiita-image-store.s3.amazonaws.com/0/151314/dffe2dd4-48ba-dce7-1bf5-814c8318e6e3.gif)