【新人プログラマ応援】この素晴らしいSwiftUIにCoreDataを！【初期設定編】

こんにちは．
Sadmachineです．
いまさらながら，このすばを見始めました．
めぐみんかわいい．

この記事ではアプリ開発の基礎...
__Xcodeプロジェクトの開始〜CoreDataの初期設定までをわかりやすく解説します！__
スクリーンショットも適宜つけるので参考にしてください！

~~CoreDataのことだけ知りてえよ！　っていう君はSection 2から見るといいと思うよ．~~

__LGTMたくさんしてね！！！__

## そもそも「CoreData」ってなに？
CoreDataとは...

Xcode上から簡単にDBのようにデータ構造を設定できたり，アプリ上で扱うデータを保存，削除，更新するプログラムを簡単に書けるようになる仕組み
[参考記事:やっとわかったSwift/CoreData入門 【part1：概念編】](https://qiita.com/pe-ta/items/89203ccc72d964277818)

とのこと．
もっと簡単に言うと...

アプリのデータをiPhoneの端末本体内のストレージに保存して永続化するために必要なもの！

って感じでしょうか．
ざっくりすぎたかな...

とりあえず，詳しいことは[参考記事](https://qiita.com/pe-ta/items/89203ccc72d964277818)を見てみてね！

## 目次
<!-- @import "[TOC]" {cmd="toc" depthFrom=2 depthTo=3 orderedList=false} -->
<!-- code_chunk_output -->
- [0. 開発環境](## 0. 開発環境)
- [1. プロジェクトを作ろう](## 1. プロジェクトを作ろう)
- [2. CoreDataの初期設定をしよう](## 2. CoreDataの初期設定をしよう)
- [まとめ](## まとめ)

<!--　次回コンテンツはこれ- [3. CoreDataに読み書きをしてみよう](## 3. CoreDataに読み書きをしてみよう)-->

<!-- /code_chunk_output -->

## 0. 開発環境
筆者の開発環境をめっちゃ簡単に紹介します．

- Xcode 12.3
- SwitfUI

以上．
もっと詳しく知りたい人はTwitterに凸して，どうぞ．

## 1. プロジェクトを作ろう！
以下の項目はXcodeをインストールしてある前提で話していきます．

### 1-1 Xcodeの起動＆プロジェクトファイルを作る
<img width="484" alt="スクリーンショット 2021-03-22 21 54 25" src="https://user-images.githubusercontent.com/65950135/111992991-6f43da00-8b59-11eb-8b58-5390478c320e.png">
Xcodeを起動すると上のような画面が出てくるので，Create a new Xcode Projectを押してください．

<img width="700" alt="スクリーンショット 2021-03-22 22 00 01" src="https://user-images.githubusercontent.com/65950135/111993528-10cb2b80-8b5a-11eb-945e-5ac5d7dedc42.png">
そうするとこんな画面が出るので[App]を選択してNext．

<img width="700" alt="スクリーンショット 2021-03-22 22 00 26" src="https://user-images.githubusercontent.com/65950135/111993794-61428900-8b5a-11eb-8eea-2068b66613cc.png">
Product Nameとかは適当につけます．

白抜きの部分も適当な名前をつけてください．
重要なのは赤く囲まれたUse CoreDataのチェックマークです．
忘れずにつけましょう．

<img width="700" alt="スクリーンショット 2021-03-22 22 06 45" src="https://user-images.githubusercontent.com/65950135/111994249-eaf25680-8b5a-11eb-83f0-f1c33d02b5fd.png">
こんな感じの画面になってればOK！

↑MugenMemoというプロジェクト名になっていますが，これがProduct Nameです．
人によって違います．

プロジェクトの作成は完了です．

### 1-2 ContentView.swiftの修正
1-1の最後の画像の通り，エラーが吐かれています．
とりあえず「ContentView.swift」の中身を以下のようにすればOKです．

```ContentView.swift
import SwiftUI
import CoreData

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                Text("TEST")
            }
        }
    }



}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```

<img width="700" alt="スクリーンショット 2021-03-22 22 12 31" src="https://user-images.githubusercontent.com/65950135/111995126-ed08e500-8b5b-11eb-9852-3b37a73fed4b.png">
ContentView.swiftの中身を変えればこんな感じでList形式でTESTという文字が出てくるはずです．
↑図ではResumeを使ってますが，エミュレーターでも同じように出ます．

これでSection 1 プロジェクトを作ろうは完了です！

## 2. CoreDataの初期設定をしよう

CoreDataの初期設定を進めていきます．

### 2-1 Entityの新規追加

<img width="700" alt="スクリーンショット 2021-03-22 22 25 31" src="https://user-images.githubusercontent.com/65950135/111996938-dcf20500-8b5d-11eb-9f5d-bc0ca0c2edf0.png">
MugenMemo.xcdatamodeldを開いて，↑図のようにEntityを作ります．

Entityを作るには，Add Entityを選択して適当な名前をつけます．
今回はMemoにしました．
Entityを作ったら，Attributeを追加します．
Attributes下の＋を押して，Attribute：title Type：String にします．

### 2-2 Entityのclass変更
ENTITESのMemoを押してDatamodelInspecter（右側の帯のいろいろな設定でるやつ）を表示させます．

<img width="700" alt="スクリーンショット 2021-03-22 22 29 59" src="https://user-images.githubusercontent.com/65950135/111997286-3ce8ab80-8b5e-11eb-9479-b688bfe71f72.png">
↑図の赤く囲った部分Class CodegenのClass DefinitionをManual/Noneに変更します．

<img width="700" alt="スクリーンショット 2021-03-22 22 34 15" src="https://user-images.githubusercontent.com/65950135/111997804-c0a29800-8b5e-11eb-9d10-4dd585069215.png">
こんな感じになってればOKです．

### 2-3 CoreDataの管理に必要なコードを手動生成

Entity名+CoreDataClass.swift
Entity名+CoreDataProperties.swift
がないとCoreDataは使えないので手動で生成します．

<img width="700" alt="スクリーンショット 2021-03-22 22 40 05" src="https://user-images.githubusercontent.com/65950135/111998639-91405b00-8b5f-11eb-83c9-e36673f56fba.png">
ENTITESのMemoを選択した状態で，Editor/NSManagedObject Subclass...を選択．
Memo+CoreDataClass.swift
Memo+CoreDataProperties.swift
の2つができたはずです．

```Memo+CoreDataClass.swift
import Foundation
import CoreData

@objc(Memo)
public class Memo: NSManagedObject {

}
```

```Memo+CoreDataProperties.swift
import Foundation
import CoreData


extension Memo {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Memo> {
        return NSFetchRequest<Memo>(entityName: "Memo")
    }

    @NSManaged public var title: String?

}

extension Memo : Identifiable {

}
```

以上でSection 2 CoreDataの初期設定をしよう　は完了です．

### 2-* もしもEntityにAttributeを追加したら...
Entityに別の属性のAttributeを追加した場合はEntity名+CoreDataProperties.swiftを編集します．
例えば，MemoにAttribute：text Type：Stringを追加した場合は以下のように編集しましょう．

```Memo+CoreDataProperties.swift
import Foundation
import CoreData


extension Memo {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Memo> {
        return NSFetchRequest<Memo>(entityName: "Memo")
    }

    @NSManaged public var title: String?
    @NSManaged public var text: String? // ここを追加

}

extension Memo : Identifiable {

}
```
「@NSManaged public var text: String?」を追加することで完了です．

## まとめ

プロジェクトの開始〜CoreDataの初期設定までをわかりやすく解説しました．
長くなりそうだったので今回はここまで．

次回は，

__CoreDataの読み書きをしてみよう！__

の予定です．
実際にSwiftUIを使いながらCoreDataに適当な文字列を追加し，保存するという一連の流れをやってみます．

備忘録的なまとめですが，誰かの参考になれば嬉しいです．
少しでも参考になりましたらLGTMやフォロー，Twitterでの拡散をしていただければ幸いです．

[次回の記事：この素晴らしいSwiftUIにCoreDataを！【CoreData読み書き編】](https://qiita.com/Sadmachine/items/eb7b149b524ce1414644)


## 参考サイト
https://capibara1969.com/3195/