【Swift】RealmSwiftを用いたいいね機能の実装

# はじめに
Realmとは、ローカルにデータを保存しておくことができるデータベースのことです。特に個人開発では、簡単にデータをローカルに保存できるため、多用することが多いと思います。
そこで今回は、realmを用いて、いいね機能を行うために必要なBool型での保存を中心に説明していきたいと思います。

# Realmのインストール

Podfileに以下を記述して、pod installを行う。

```
pod 'RealmSwift'
```

# Realmを使ってメモアプリの実装

![スクリーンショット 2021-02-18 22.27.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358154/24b084d7-4867-333c-3e82-169da8f89c60.png)

# クラスファイルを作成
新しいファイルを作成し、以下を記入。
新しいファイルの中でDiaryというクラスを作成する。ObjectというのはRealmが用意しているもので、これを書くことによってクラスをRealmに保存することができる。
また、Realmのクラスでは、変数を定義する前に@objc dynamicと記述しなければいけない。

```swift
import Foundation
import RealmSwift

class Diary: Object {
    @objc dynamic var date = ""    //日付を格納する変数
    @objc dynamic var content = ""    //メモ内容を格納する変数
    @objc dynamic var isLikeOnRealm = false    //いいねをおしたかどうか判定する変数
}
```

# Realmにデータを保存する
@IBAction func add()は、Saveボタンの処理であり、textFieldに記入された文字をRelmに保存する。
また、@IBAction func Like()はLIKEボタンを押した時の処理で、RealmのisLikeOnRealmにtrueを保存する。

```swift
import UIKit
import RealmSwift

class AddViewController: UIViewController {

    @IBOutlet var dateTextField: UITextField!
    @IBOutlet var contentTextField: UITextField!
    @IBOutlet var button: UIButton!
    
    var realm: Realm!
    
    let diary = Diary()
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        button.layer.cornerRadius = 15
        realm = try! Realm()
        diary.isLikeOnRealm = false
        print(diary.isLikeOnRealm)
    }
    
    @IBAction func Like() {
        diary.isLikeOnRealm = true
    }
        
    @IBAction func add() {
        //Diaryクラスのインスタンスを作成
        //nilであれば、Undefiedを代入
        diary.date = dateTextField.text ?? "Undefined"
        diary.content = contentTextField.text ?? "Undefined"
        
        try! realm.write {
            realm.add(diary)
        }
        
        self.navigationController?.popViewController(animated: true)
    }
}
```

# Realmに保存されているデータを取得
LIKEが押されていた際に、星マークがつく処理を記述しました。

```swift
import UIKit
import RealmSwift

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet var table: UITableView!
    
    
    var realm:Realm!
    var diaries:Results<Diary>!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        table.delegate = self
        table.dataSource = self
        
        realm = try! Realm()
        
        diaries = realm.objects(Diary.self)
        table.reloadData()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        diaries = realm.objects(Diary.self)
        print(diaries.last?.isLikeOnRealm)
        table.reloadData()
    }
    
    @IBAction func saveButton() {
        performSegue(withIdentifier: "toSave", sender: nil)
    }
      
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return diaries.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let isLike = diaries[indexPath.row].isLikeOnRealm
        var like: String = ""
        
        if isLike {
            like = "★"
            print(indexPath.row)
        }
        
        cell.textLabel?.text = like + diaries[indexPath.row].content + " - " +  diaries[indexPath.row].date
        
        return cell
    }
    
}

```

#おわりに
今回ざっといいねを実装するためのベースの考え方を紹介しました。
TableViewCell上にボタンを配置していいね機能を実装したり、ブックマーク機能を実装する際の参考にしていただければ幸いです。