【Swift4】FSCalendarのカレンダーに表示する点マークとテーブルのセルの数を対応させる

# 概要
FSCalendarではカレンダーの日付の下に任意の条件で点マークを表示することができます。
今回はRealmDataBaseと組み合わせてデータが入っているcellの数に応じて点マークを表示してみます。
FSCalendarの導入方法は本家のライブラリのソースが上がっているGitHubのreadmeに書かれていますので、そちらをご参照ください。

[WenchaoD/FSCalendar](https://github.com/WenchaoD/FSCalendar)

# 実行環境
【Xcode】 Version 10.1
【Swift】 version 4.2.1
【CocoaPods】version 1.6.0
【Realm Database】 3.13.1
【FSCalendar】version 2.8.0

# 実装方法
以下のメソッドを用いることで点マークがつけられるようになります。しかしこのまま用いても全ての日付の下に点マークが付くようになるだけです。
これをRealmDataBaseと組み合わせることで、任意の日付に任意の数の点マークがつけられるようになります。

```swift
func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int{
        return 1 //ここに入る数字によって点の数が変わる
    }
```

# 実装前の状態
点マークをつける前の状態です。
<img width="707" alt="スクリーンショット 2019-04-14 20.54.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347128/74a24841-ee56-e0bf-4fb8-f2b120038f20.png">


```swift
import UIKit
import FSCalendar
import RealmSwift

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, FSCalendarDelegate, FSCalendarDataSource {
    
    @IBOutlet weak var calendar: FSCalendar!
    @IBOutlet weak var tableView: UITableView!
    var list: Results<Data>!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        calendar.dataSource = self
        calendar.delegate = self
        tableView.dataSource = self
        tableView.delegate = self
        
        // サンプルデータを追加
        for i in 1...3 {
            let newList = Data()
            newList.title = "テスト" + String(i)
            newList.date = Date()
            do {
                let realm = try Realm()
                try realm.write({ () -> Void in
                    realm.add(newList)
                })
            } catch {
            }
        }

        // Realmからデータを取得
        do {
            let realm = try Realm()
            list = realm.objects(Data.self)
        } catch {
        }
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return list.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // セルを取得する
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "calendarsCell", for: indexPath)
        cell.textLabel!.text = list[indexPath.row].title
        
        return cell
    }
}
```

# 実装後の状態
RealmDBから日付が最初(0時）と最後(24時)の間で設定されているデータを取得し、そのデータの数を返すようにすることで任意の日付に任意の数の点マークがつけられるようになります。

```swift
    // リストの数だけ日付に点マークをつける
    func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int{
        var tmpList: Results<Data>!
        // 対象の日付が設定されているデータを取得する
        do {
            let realm = try Realm()
            let predicate = NSPredicate(format: "%@ =< date AND date < %@", getBeginingAndEndOfDay(date).begining as CVarArg, getBeginingAndEndOfDay(date).end as CVarArg)
            tmpList = realm.objects(Data.self).filter(predicate)
        } catch {
        }
        return tmpList.count
    }
    
    // 日の始まりと終わりを取得
    private func getBeginingAndEndOfDay(_ date:Date) -> (begining: Date , end: Date) {
        let begining = Calendar(identifier: .gregorian).startOfDay(for: date)
        let end = begining + 24*60*60
        return (begining, end)
    }
```

<img width="707" alt="スクリーンショット 2019-04-14 21.11.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/347128/f34b333c-8907-fbf6-267d-9e723428305e.png">

どなたかのお役に立てたら幸いです。

# 参考
[Swiftで簡単にカレンダーを作ろう！(FSCalendar)](https://qiita.com/Koutya/items/f5c7c12ab1458b6addcd)
[Swift4 + Realmでカレンダーアプリを作ってみた。](https://qiita.com/umagoro/items/121b549852bedf391377)