Realmで簡単なToDoアプリ【Swift4.0】

#はじめに
この記事はロボP Advent Calendar 2018の22日目の記事です。
#目的
RealmSwiftをつい最近使ったのでそれについてまとめる
ここでは、基礎的なiPhoneアプリ作成手順を追いながら記載していく。
初歩の初歩から掲載しているので、分かる方は適宜読み飛ばしをしていってほしい。
また、ここではコードはスクショで統一させてもらっているので、そこはご了承願いたい。
#作成
###環境
- Xcode10
- Swift 4.0 

###Cocoapodsのインストール
インストールにあたっては、こちらのサイトを参考にされたし。
[Cocoapodsのインストールについて](http://developers.goalist.co.jp/entry/2017/04/20/180931)
###新規プロジェクトを作成
File > New > Project 或いは Shift+⌘+N で新規プロジェクトを作成する。 
選択は「Single View App」
![スクリーンショット 2018-12-22 12.37.44.png](https://qiita-image-store.s3.amazonaws.com/0/316623/17f98f6b-a478-6011-0bdd-e93b55fd8d99.png)
次の設定画面でのProductNameは、自分で分かりやすいように決めて頂きたい。その他Language等の設定に違いが無いか確認したらNext
![スクリーンショット 2018-12-22 12.42.14.png](https://qiita-image-store.s3.amazonaws.com/0/316623/a55389b9-5624-577f-2585-3b1a71e34e6a.png)
するとプロジェクトを保存する場所を訊かれるので、任意の場所を選択して保存。
正常にプロジェクトが生成されたことを確認できたら、***RealmSwiftを導入するにあたって、xcodeprojを開いたままだとインストールできないので***一度編集画面を閉じる。
###RealmSwiftのインストール
####フォルダ移動
まずターミナル.appを起動して、先程生成したプロジェクトフォルダまで移動する。
簡単に移動する方法として、Finderで任意の場所に移動して、以下の画像のフォルダ名を右クリックしてメニューから「"〇〇"のパス名をコピー」を選択。
これが表示されていない人は、メニューバーの 表示 > パスバーを表示　を選択すれば表示される。
![スクリーンショット 2018-12-22 12.54.00.png](https://qiita-image-store.s3.amazonaws.com/0/316623/207af3c3-0169-3d02-1d57-c732aa2114df.png)
そしたらターミナルに戻り、コマンドを利用することで任意ディレクトリへと移動できる。
cdの後に半角スペースを入れ、先程コピーしたパス名をペーストすれば良い。

    cd /Users/〇〇/Documents...
####pod fileの作成

    pod init
このコマンドを実行した後に先程のフォルダーを見るとPodfileが新たに作成されていることが確認できる。
これをダブルクリックで開き以下のような内容があるか確認する

```
target 'RealmToDo' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for RealmToDo
```

そしたら以下のように`use_frameworks!`の下に`pod ‘RealmSwift’`を記述し、保存して閉じる。

```
target 'RealmToDo' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for RealmToDo
  pod ‘RealmSwift’
```
####RealmSwiftのインストール
ターミナルに戻り以下のコマンドを実行する。

    pod install
このコマンドの実行が完了した後、先程のフォルダを確認すると、このような白いアイコンの.xcworkspaceというファイルが新たに作成されている。
![スクリーンショット 2018-12-22 13.23.23.png](https://qiita-image-store.s3.amazonaws.com/0/316623/085e2467-8fcf-5069-4a76-6ab26161711f.png)
次回からこのプロジェクトを編集する時は、このファイルから開く様にする。
このファイルを開くと、先程作成したアプリの開発画面に移動できる。
###画面作成
今回のアプリの画面構成はこのような感じだ。
![スクリーンショット 2018-12-22 13.31.47.png](https://qiita-image-store.s3.amazonaws.com/0/316623/4a6bfbe9-5167-9eb5-e75c-967f98b538c3.png)
右上のボタンから画面遷移を行う様にし、遷移はShowを利用している
また、TableView内のセルのIDは`cell`とした。
この他画面作成にあたっては今回は割愛させてもらう。
ここで新しい画面を追加しているので、新たなViewControllerが必要になる。
メニューバーから`File > New > File.. > Cocoa Touch Class` を選択し、`Subclass of`をUIViewControllerにして任意の名前を付けて保存をする。
![スクリーンショット 2018-12-22 13.41.21.png](https://qiita-image-store.s3.amazonaws.com/0/316623/e06c40a3-8f73-90da-6b60-1092ee090f34.png)
![スクリーンショット 2018-12-22 13.41.28.png](https://qiita-image-store.s3.amazonaws.com/0/316623/256a4f9d-9e72-4e5a-d9f5-826128f2dccc.png)
新しいファイルを生成できたら、追加したViewコントローラーと紐づけをする。ここではAddViewControllerという名前にして紐づけを行った。
![スクリーンショット 2018-12-22 13.42.56.png](https://qiita-image-store.s3.amazonaws.com/0/316623/5e7ad825-74a0-b45a-70b5-ea9ec667e56e.png)
###Class作成
Realmを利用するにはclassが必要である。
新たにSwiftファイルを作成する。`File > New > File.. > Swift　file`から作成する。名前はここではTodo.swiftとした。
ファイルを作成できたら、以下のように記述をした

***Todo.swift***
![スクリーンショット 2018-12-22 14.15.45.png](https://qiita-image-store.s3.amazonaws.com/0/316623/543a5976-e88a-3b8f-e01e-1cfcda47b45a.png)
import文でエラーが出て来た場合は、⌘+Bでビルドすればエラーは解消する。
また、ViewControllerに移動して以下の内容を追加した

***ViewController.swift***
![スクリーンショット 2018-12-22 14.28.34.png](https://qiita-image-store.s3.amazonaws.com/0/316623/8566a067-a4e0-6393-38dd-8d7b6d59ddc9.png)

```swift
let realm = try! Realm()
todoItems = realm.objects(Todo.self)
```
ここで変数`realm`にRealmのデータベースを読み込んで、その中のobjectの`Todo`を取り出し、`todoItems`に代入をしている。

###TableView
TableView周りの記述について載せていく。
まず、データソースの場所がこのViewなので、class宣言のところに以下のように記述をする。

***ViewController.swift***
![スクリーンショット 2018-12-22 13.52.43.png](https://qiita-image-store.s3.amazonaws.com/0/316623/ad1ccd2f-0242-f061-50eb-c7ddbbabd1f5.png)
エラーが出るが、そこをクリックするとFixボタンがある筈なのでそこをクリック。必要な記述(セル数指定とセル表示指定についてのメソッド)を自動的に生成してくれる。
![スクリーンショット 2018-12-22 13.59.30.png](https://qiita-image-store.s3.amazonaws.com/0/316623/d7489a6d-6a11-43ce-2e2a-edc31cc5e87c.png)
![スクリーンショット 2018-12-22 13.59.38.png](https://qiita-image-store.s3.amazonaws.com/0/316623/0f24e01e-bdb3-7d43-c17a-3babb0bcce4a.png)
テーブルビューの紐付けを行う。ここでは名前は`table`とした
![スクリーンショット 2018-12-22 14.04.19.png](https://qiita-image-store.s3.amazonaws.com/0/316623/865bdfec-5cd9-1c0b-0a64-f998ea39c124.png)
また、以下のコードを追加した。
尚、この画像内では自動生成されたコードを下に移動させている。

***ViewController.swift***
![スクリーンショット 2018-12-22 14.43.57.png](https://qiita-image-store.s3.amazonaws.com/0/316623/6b54a44f-6d7e-aea6-290f-2794ccd2b9a9.png)
ここで一気にセル数指定、セルの表示について記述していったが、ここではあまり重要ではないので詳細は別途調べていただきたい。

削除処理のコードも追加した。
![スクリーンショット 2018-12-22 15.27.07.png](https://qiita-image-store.s3.amazonaws.com/0/316623/7a094170-ca75-6d65-ed5e-30075a0da1e2.png)
`deleteTodo`メソッドでrealmに関する処理を行っている


```swift
try! realm.write{
   realm.delete(todoItems[index])
}
```
このコードでrealmの任意のデータを削除できる。

###AddViewController
このViewでRealmに保存する記述を行っていく。
まず、TextBoxとButtonの紐付けを行う。
![スクリーンショット 2018-12-22 14.57.00.png](https://qiita-image-store.s3.amazonaws.com/0/316623/d913e9fc-db66-17c9-bd94-cbf830b02646.png)
次に、メソッド`addButton`内を記述していく。ここでRealmへの書き込み処理を行っていく。
記述したコードは以下の通り。
![スクリーンショット 2018-12-22 15.00.10.png](https://qiita-image-store.s3.amazonaws.com/0/316623/aa3a2855-3275-8c60-5f2b-16532c9f7ae2.png)
動作としては、
まずrealmを読み込み、Todoクラスをインスタンス化する。
作成したインスタンスにテキストボックスの内容を代入した後、以下の部分でデータベースに書き込みをしている。


```swift
try! realm.write{
   realm.add(todo)
}
```
最後の行でNavigationControllerの一つ前のViewに移動する処理をしている。こうすれば二重で登録したり、手で一つ前の画面に戻ったりしなくて済む様になる。

また、テキストボックス内で改行を押すと勝手にキーパッドがしまわれる処理も記述しておいた。
![スクリーンショット 2018-12-22 15.13.42.png](https://qiita-image-store.s3.amazonaws.com/0/316623/5f55d3c9-5f12-84ab-2060-1f3b5e4b2981.png)

##完成
これで一通りTodoで保存、読み込み、削除ができるようになる。
![スクリーンショット 2018-12-22 15.38.43.png](https://qiita-image-store.s3.amazonaws.com/0/316623/0325cfe4-5b36-7d9c-23fd-290d167ca840.png)
![スクリーンショット 2018-12-22 15.38.51.png](https://qiita-image-store.s3.amazonaws.com/0/316623/2d8862e0-d73f-8894-fb7b-687826356e72.png)


##参考
[Swift：超簡単データベース！Realmを使った超簡単お手軽Todoアプリ！！](http://programming-beginner-memo.com/?p=16)
[RealmSwiftとUITableViewを使用してToDoアプリを作成](https://qiita.com/TsukasaHasegawa/items/4dfaa87add7b6866f858)