Xcodeでアプリ開発、最初にやること

どうもこんにちは。[フエルマネー](https://apps.apple.com/us/app/%E3%83%95%E3%82%A8%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC/id6446435231)の開発者です。

性格的にコード汚いのが許せないんですが、基本的に最初書いたコードは汚いので１から書き直すという暴挙に出ることがしばしばあります。

この記事は、何度かプロジェクトを作ったことがある人、久々にiOS開発をする人にも役立ちます。まず最初にプロジェクトを綺麗な状態にするための、一連の流れをまとめました。

# プロジェクトを作成
何はともあれ、新規プロジェクトを作成しましょう。

・Xcodeを起動
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/f581034f-6417-3470-94f1-6926fa3216db.png)
・Create a new Xcode projectを選択
・iOS > Appを選択してNext
・適当なProductNameを入力
・全部チェック(任意)してNext
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/f49c2d46-ad8d-b294-829e-5d860f783e81.png)
下3つのチェックボックスは各種機能を使うかどうかで判断してくださいね。今回は機能もりもりなので全部チェックしときます。ちなみにTestsは使ったことないです。

・プロジェクトの保存先を指定
・Create Git repositry on my Macにチェック(任意)してCreate
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/5775e2d7-c2f6-0851-7a20-f5268dd7f86d.png)
Gitで管理する場合のみチェックしましょう。今回僕も初めてちゃんとGitで管理することにしましたので。

さて、プロジェクトが作成されました。
なんか色々読み込んでますね。そんでもってサンプルコードがごちゃごちゃしてる。
![4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/9337b314-e1ce-b174-d1ae-f8ad2ed58434.png)
そうなんです。CoreDataにチェックを入れるとCoreData仕様のサンプルになるので普通のサンプルよりごちゃごちゃしてるんです。

# サンプルコードを消す

では、バッサリ行きましょうか。
まずはContentView。これはSwiftUIで最もメインの画面です。
色々書いてますがほぼ全部消します。残す部分はというと、、、

```swift:ContentView.swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("hoge")
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
    }
}
```
これだけです。
正直、下のContentView_Previewも僕はコメントアウトします。
コーディング中、横にプレビューを表示するために必要ですが、あまり使わないので。

続いてPersistence。これはCoreDataにアクセスするためのなにがしですね。
このファイルは基本いじらないんですが、プレビュー用のサンプルが入ってて、これが悪さをするんで消しておきます。

```diff_swift:Persistence.swift
static var preview: PersistenceController = {
    let result = PersistenceController(inMemory: true)
    let viewContext = result.container.viewContext
-    for _ in 0..<10 {
-        let newItem = Item(context: viewContext)
-        newItem.timestamp = Date()
-    }
    do {
        try viewContext.save()
    } catch {
        // Replace this implementation with code to handle the error appropriately.
        // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        let nsError = error as NSError
        fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
    }
    return result
}()
```
次は[プロジェクト名].xcatamodelというファイルに行きます。
ここではCoreDataのデータベース定義ができます。
サンプルのEntity（データベースでいうTable）は消しましょう。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/2d7de377-ac7c-e41b-240f-fa8f724cc40e.png)
※選択してDeleteキーで消せます。

# 諸々の設定
プロジェクト全般の設定画面には、ナビゲーターのルート部分を選択して移動できます。
・TARGETS > [プロジェクト名]を選択 > Generalに移動
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/bf9bc130-0934-9544-c4ff-fc3dfc2d5b0c.png)
・Supported Destinations：対応端末を追加または削除してください
・Minimum Deployments：最新になってますが、これだとリリースした時にiPhoneをアップデートしてない人はインストールできません。僕は16.0くらいに下げてます。上の桁まで下げると、色々対応に迫られるので僕は絶対下げません。
・Identifity > App Category：カテゴリを自由に選ぶ
・Identifity > Display Name：ホーム画面でアイコンの下に出るアプリ名
・Identifity > Bundle Identifier：リリースする時にやってください
・Identifity > Version, Build：とりあえずこのまま

# 実行してみる
簡単なことしかしてないですが、一応実行して確認してみます。
本当はエミュレータ→実機というプロセスがいいんでしょうけど、僕はいきなり実機をブッ刺します。

・自前のiPhoneをケーブルで接続します
※iPhoneはロック解除して開いておきましょう
![7-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/08521018-1001-add4-611e-6a6768e9501f.png)
端末を選ぶところに、自分のiPhone名が表示されてますね。これを選択します。

左の方にある再生ボタン:arrow_forward:を押して実行しましょう。

しばらくして、Build Successedとなります。
またしばらくして、iPhone上でアプリが立ち上がります。
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/81a02db0-ab77-e719-8bba-847c35107bed.png)
これで確認完了です。

終わり

# トラブルシューティング
エラーが起きましたか？考えられる要因をここにまとめておきます。
手順通りにやったのにうまくいかない方は、まずここをみてください。
他にもうまくいかないパターンがあったら、コメントしてください。

・iPhoneのロックは解除していますか？
・iPhoneのiOSバージョンは、先ほど指定した対応バージョン以上ですか？
・iPhoneのデベロッパモードは有効ですか？
・AppleIDを作成して、XcodeでSigningしていますか？