独学でiOSアプリ開発をできるようになりたかった私の学習ロードマップ（2019-2020年）

# はじめに
　ちょうど去年の2019年10月頃に、SwiftでiOSアプリ開発をしたいと思い学習を始めました。iOSアプリ開発に関して全く未経験だったので、初めは初心者向けの書籍だったり、Udemyの講座から学習を初めました。そして1年と少し経過した現在、良い手応えを感じつつちょっとしたアプリを作成できるようになってきました。
　私が学習する中で、教材選びや実際にアプリを作るときに多々困ることがありました。これからiOSアプリ開発を初めたい方や、初心者向けの教材を終えたけど次何をしよう…と困っている方の一助になれば幸いです。

# この記事の対象者
- iOSアプリ開発を新しく始めたい方
- 初心者向けの本を読み終えたけど次何をしたら良いか分からない方
- 実際にアプリを作ろうとしていて悩んでいる方
- 英語がちょっと分かる方（紹介する講座が英語のため。センター試験のリスニングレベルで十二分です）

# 私の通ってきた学習ロードマップ
以下これまでに私の通った学習ロードマップをまとめます。期間としては2019年10月-2020年12月の一年ちょっとになります。（厳密には2年前に読んだ本も含んでいます）

## 1. iOSアプリ開発の基礎知識を身につける
### 初心者向けの本をたくさん読む
- 私がiOSをやりたいと思ったときに、初心者向けの本をいくつか写経することから始めました。
- 初心者向けの日本語の書籍は多いのでありがたいですね。各本のざっとした所感をば
- [絶対に挫折しない iPhoneアプリ開発「超」入門 第8版](https://www.amazon.co.jp/%E7%B5%B6%E5%AF%BE%E3%81%AB%E6%8C%AB%E6%8A%98%E3%81%97%E3%81%AA%E3%81%84-iPhone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%80%8C%E8%B6%85%E3%80%8D%E5%85%A5%E9%96%80-%E7%AC%AC8%E7%89%88-%E3%80%90Xcode-%E5%AE%8C%E5%85%A8%E5%AF%BE%E5%BF%9C-ebook/dp/B08BWWFFD8/)
    - 全くの初心者の方におすすめしたいです。これ以上わかりやすいものは無いだろう、というくらい親切です。
- [詳細！Swift iPhoneアプリ開発 入門ノート iOS 12+Xcode 10対応](https://www.amazon.co.jp/gp/product/B07JZ188FK/)
    - 前半がSwiftの文法解説が淡々と続きます。サンプルコードがあり説明がわかりやすいです。しかし単調なので私は途中でしんどくなってしまいました。
    - 後半は機能が短編形式で紹介されます。順番にやるのではなく各機能をつかいたいときにリファレンスとして使うのがいいかなと思いました。
- [UIKit Apprentice](https://www.raywenderlich.com/books/uikit-apprentice/v9.0)
    - 全くの初心者から、一通りの実装をしたアプリが作れるようになる良本です。
    - 平易な英語ですので、抵抗がなければ私はこれから始めるのをおすすめします。
    - 4つのアプリを1000ページ以上かけてじっくり実装します。最後にはApple StoreのAPIを使用したり`iPad`対応まで行います。
    - （ちなみに私の版では`iOS Apprentice`という名前でした）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">iOS Apprenticeの最後のプロジェクトがやっと…終わった…。<br>コングラッチュレーション私！ <a href="https://t.co/mGlu6vBSNh">pic.twitter.com/mGlu6vBSNh</a></p>&mdash; IKEH (@ikeh1024) <a href="https://twitter.com/ikeh1024/status/1249364815472021515?ref_src=twsrc%5Etfw">April 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 初心者向けのUdemy講座を受講
- 本を読んだあと、ざっと復習したいと思い下記の講座を受講しました。
- [iOS 13 & Swift 5 \- The Complete iOS App Development Bootcamp](https://www.udemy.com/course/ios-13-app-development-bootcamp/)
- こちらはUdemyのiOSのベストセラー講座です。
- 先に紹介した[UIKit Apprentice](https://www.raywenderlich.com/books/uikit-apprentice/v9.0)とは対象的に、広く浅くカバーしています。
- Swiftの文法、MVCまでの一通りの実装から`CocoaPods`によるサードライブラリの使い方、果ては`ARKit`や`CoreML`・デザイン・マーケティングと多岐にわたります。
- これがおすすめの理由として、挫折しにくいという点があります。
    - 講師の`Dr. Angela Yu`さんの人柄が非常に良いです。
    - また講座を通してモチベーションを高めてくれます。
    - しんどいときは散歩するといいよというアドバイスや、最初の20分椅子に座るのが大事といったルーティーンの紹介、ときには講師の個人的なエピソードが、単調になりがちな講座を彩ってくれます。
- 細かいところでは、Google検索の仕方や検索結果の見方もうれしいトピックでした。

> - Googlingの仕方
>   - `調べたい内容` `言語` `ソース`」で検索
>   - e.g. `play sound Swift stackoverflow`
> - StackOverFlowの見方
>   - ベストアンサーだけでなく上位3つをみて、最も関係のあるものを参考にすると良い
>   - とりあえずそのままコピペ
>   - ドキュメントを見てコードが何をしているかを理解する
>   - 自分用にコードを変更する

- 50時間超えの大ボリュームですが、文法が分かっている人はこのPartから、というのがあったりするので、いくつかショートカットは可能です。
    - あとデザインやマーケティングの部分も多いですからね。
    - 私もいくつか`SwiftUI`や`CoreML`などを飛ばしていて、結局進捗率は60%ちょっとで終わっていました。
 
 <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">書籍と比べるのも何だけれど、iOS Apprenticeよりもエンタメ性があって続きやすいな。<br><br>こちらの<a href="https://twitter.com/udemy?ref_src=twsrc%5Etfw">@Udemy</a>コースはいかかでしょうか: iOS 13 &amp; Swift 5 - The Complete iOS App Development Bootcamp <a href="https://t.co/nFx3lHDRDT">https://t.co/nFx3lHDRDT</a></p>&mdash; IKEH (@ikeh1024) <a href="https://twitter.com/ikeh1024/status/1262401812839100422?ref_src=twsrc%5Etfw">May 18, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
 
### 反省とまとめ
- 初心者向けの教材は豊富ですが、私はもう少し数を絞るべきでした
- 重複する内容が多く、遠回りだったと思います
    - 知っている内容を繰り返すのは快適ですが、成長にはなりませんね…
- 全くの初心者でワンクッション欲しい方は<br>[絶対に挫折しない iPhoneアプリ開発「超」入門 第8版](https://www.amazon.co.jp/%E7%B5%B6%E5%AF%BE%E3%81%AB%E6%8C%AB%E6%8A%98%E3%81%97%E3%81%AA%E3%81%84-iPhone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%80%8C%E8%B6%85%E3%80%8D%E5%85%A5%E9%96%80-%E7%AC%AC8%E7%89%88-%E3%80%90Xcode-%E5%AE%8C%E5%85%A8%E5%AF%BE%E5%BF%9C-ebook/dp/B08BWWFFD8/)を挟むといいと思います。
- あとは[UIKit Apprentice](https://www.raywenderlich.com/books/uikit-apprentice/v9.0)もしくは<br>[iOS 13 & Swift 5 \- The Complete iOS App Development Bootcamp](https://www.udemy.com/course/ios-13-app-development-bootcamp/)のどちらかを受講すれば、最初のステップとしては十分な知識を得られると思います。

## 2. 小規模アプリを作成してリリース
### 小規模アプリを作成
- ここまでで小さいアプリを作成できるだけの知識は身につきました。
- ミニマムな機能を備えたアプリを一度リリースしたいと思い、作成を始めました。
    - アプリをリリースしなくてもいいと思いますが、Qiita記事に載せるような動作サンプルの以上の完成度のものを作ると学びが大きいと思いました、
    - アプリを作成する中で、教本で学習するときには疑問にも思わなかったことがいくつも出てきたり、習っていない事柄もでてくるので、強度の高い学習になるかと思います。
- あとは自分で書いた信頼できるプログラムがあると、同じような処理を書くときに参考になるのが個人的にありがたかったです。
    - 例えば私は`UserDefaults`の書き方はどうだったかな〜というときにGitHubのリポジトリを何回も見返しています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">iOSアプリ「たずね人コンパス」をリリースしました🎉<br><br>目的地までの方角を示してくれる便利なコンパスです。<br><br>・歩きスマホをしたくない…<br>・地図アプリを見るのが面倒…<br>という方におすすめです。<a href="https://t.co/VkzBVPH8EP">https://t.co/VkzBVPH8EP</a> <a href="https://t.co/7jpLUVZ7IE">pic.twitter.com/7jpLUVZ7IE</a></p>&mdash; IKEH (@ikeh1024) <a href="https://twitter.com/ikeh1024/status/1266149705668374529?ref_src=twsrc%5Etfw">May 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- プロジェクトとしては下記の規模感です。
- これでも結構苦労していたので、小さく機能をミニマムにしていて良かったです。やり遂げるのが本当に気力がいりました。

<img width="512" alt="image" src="https://i.imgur.com/eCLVuYH.png">

<img width="512" alt="image" src="https://i.imgur.com/01jjeoO.png">

### 実装で参考にした本とUdemy講座
- `iOS Apprentice v8.2.1`の `MyLocations`を主に参考にしています。
	- `CoreLocation` `MatKit`  `CoreData`の詳細な使い方
- [iOS 13 & Swift 5 \- The Complete iOS App Development Bootcamp](https://www.udemy.com/course/ios-13-app-development-bootcamp/)
  - またCoreData（Todoey-CoreData-iOS13-Completed-master）, CoreLocation（Clima-iOS13-master）辺を軽く参考にしています

## 3. 中規模アプリを作るUdemyの講座を受けて進化
### この時点で困っていたこと
- さて無事に小規模アプリをリリースすることができました。（ダウンロード数はさておき…）
- よーしもっとアプリ作るぞ！と意気込みたい所ですが、小規模アプリを作る中で私は限界を感じていました。
- それは**これ以上の規模になったらクラスが多くなりすぎて収集がつかなくなる**ということです。
    - [UIKit Apprentice](https://www.raywenderlich.com/books/uikit-apprentice/v9.0)の4つ目のアプリの規模はそこそこのものですが、全てを把握するのが辛いなと感じていました。
- これまでの学習で簡単なMVCパターンで小さなアプリの作り方を学びましたが、中規模アプリの作り方は習っていないので、今思うと当然ですね。

### 中規模アプリを作るUdemy講座
#### 出会い
- そこで中規模アプリを作る講座はないかな〜とUdemyを探していたら、出会いました…これです！
- [Twitter iOS Clone \| Swift 5/Firebase \| No Storyboards \| MVVM](https://www.udemy.com/course/twitter-ios-clone-swift/)
- タイトルの通り`Storyboards`を使わずにMVVMパターンでiOSクローンを作成する、というものです。
- 勿論筆者はこの時点で`Storyboards`を使わないのもMVVMパターンを使うことにも経験はありません。
- いくつかトピックに分けて動画の感想を書いていきます。

#### 全体の所感
- 一応講座レベルを中級と謳っていることもあり、for文などから始めるようなことはありません。
- また文法は一通り分かっている前提で始まりますが、なぜこう書くのかは逐一説明してくれるので、ついていけないことは全く無かったです。
- MVCがちょっと分かってきたかも…という次のステップにピッタリなレベル感でした。

#### MVVMパターン

- 自分の言葉で表現すると「MVCでControllerクラスからデータ類をModelにまとめるのと同様に、Viewからデータ類をViewModelにまとめる」という感じでしょうか。
- 具体的には下記のように、`ViewModel`側にデータを渡して、必要な文字列やUIパーツを作成するロジックを書いていきます。

```swift
struct TweetViewModel {
    
    // MARK: - Properties
    
    let tweet: Tweet
    let user: User
    
    var headerTimestamp: String {
        let formatter = DateFormatter()
        formatter.dateFormat = "h:mm a ∙ MM/dd/yyyy"
        return formatter.string(from: tweet.timestamp)
    }
    
    var retweetAttributedString: NSAttributedString? {
        return attributedText(withValue: tweet.retweetCount, text: "Retweets")
    }
    
    var likeButtonImage: UIImage {
        let imageName = tweet.didLike ? "like_filled" : "like"
        return UIImage(named: imageName)!
    }
    // （省略）
}
```

#### Firebase
- Firebase周りはそういうものという感じで、説明少なめでサクサク進みます。    
- `.observe`がDB更新のタイミングで呼ばれるのが慣れませんでした。
    - 検索結果が自動で更新されるのは、あとで`Realm`を触ってみて理解が深まりました。
    - 本筋ではないので、わからない場合は深く考えなくていい箇所だと思います。

#### Storyboardsを使わずにコードでUIの作成
- `Storyboard`を使わないiOSの実装は初めてでした。
- 講師曰く「UIをStoryBoardで作成しているなら、早く脱却してコードで書くようにするべき。Appleは`SwiftUI`に代表されるように、コードでUIを制御する方向に向かっているため。」とのこと。
- 特に本アプリでは、`NavigationController`によって同じビューが何層も重なるので、Storyboardだと大変になりそうです。
- 個人的にこのコースの隠れた目玉だと思っているのが下記の`AutoLayout`のための`UIView`の`Extension`です。
    - [Twitter/Twitter/Util/Extensions.swift](https://github.com/weidong6686/Twitter/blob/cff89c912a99129636ce33dc38ebbfee8a197367/Twitter/Util/Extensions.swift)
- 前々から素で書くと面倒だなあと思っていたのですが、これで幸せになれそうです。

```swift
// Extensionがあるとき
profileImageView.anchor(top: containerView.bottomAnchor,
                                left: leftAnchor,
                                paddingTop: -24,
                                paddingLeft: 8)
                                
// Extensionがないとき
gameOverView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
gameOverView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
gameOverView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
gameOverView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
gameOverView.layoutSubtreeIfNeeded()
```

#### 講座で使用する外部ライブラリ
- 外部ライブラリは`Cocoapods`で管理します。
- 使用したライブラリは`Firebase`・`SDWebImage`・`ActiveLabel`です。
- 特に`SDWebImage`は画像のキャッシュ処理なども内部でゴニョゴニョしてくれるそうで、今後とも仲良くしたい便利なライブラリでした。

#### クラス毎の構造的な書き方
- ルール化された`MARK: -`を使ったり`extension`を利用して、下記の通り構造的なクラス構成になっています。
- 一つのクラスで最大200行程度なのも後から追いやすくて良い感じした。

![-w804](https://i.imgur.com/uNl6YNi.jpg)

- 何回も出てくるので、以下のスニペットをXcodeに登録しておくと講座の際に便利でした。

```swift
// MARK: - Properties

// MARK: - Lifecycle

// MARK: - API

// MARK: - Selectors

// MARK: - Helpers
```

### Udemy講座を受けたあとの状態
- MVVMパターンを使ったりやコードベースでUIを作成することで、中規模のソースコードを構造的に破綻すること無く書ける自信が付きました。
- これでようやく中規模アプリを作れる目処がついたので、実際に作成にとりかかることにしました。
- （下はMVVMひゃっほう！と思っているときの私）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">MVVMでmacOSアプリも書いてみたいな。</p>&mdash; IKEH (@ikeh1024) <a href="https://twitter.com/ikeh1024/status/1299285063469735936?ref_src=twsrc%5Etfw">August 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 4. 中規模アプリを作成しながら、足りない知識を学習（今ここ）
### アプリの作成
- ようやく中規模アプリを作る土台ができました。
- 私はTwitterがとても好きなので、Twitter APIを使って中規模のアプリを作成しようと思い、現在作成を進めています。
- アプリの構造としては先の[Twitter iOS Clone \| Swift 5/Firebase \| No Storyboards \| MVVM](https://www.udemy.com/course/twitter-ios-clone-swift/)の設計を基にしています。
    - MVVMパターンやコードでUIを作成する方法・APIの書き方など
- ↓作成中のアプリ。先の講座がかなり参考になっています！

<img width="300" alt="image" src="https://i.imgur.com/Uhb7DT3.png">

### 足りない知識を学習
- ここまでの講座に加えて、Swiftの文法の理解を深めるため[Swift実践入門](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297112132/)を読みました。
    - これまでの講座で登場していない`throw`を使ったエラーハンドリングだったり、よく分からないまま使っていた`convenience init`など、いくつも理解が深まりました。
    - 初心者のときに読むと難しいですが、この時点では「そういうことだったのか」となるので、読むのにぴったりなタイミングだと思います。
- あとアプリに必須級の「情報を保存させたい」（けどCoreDataは複雑で使いたくない…）と思い`Realm`の本を読みました。
    - [Realm: Building Modern Swift Apps with Realm Database](https://store.raywenderlich.com/products/realm-building-modern-swift-apps-with-realm-database)
    - 基本的な概念から、運用しやすくテストもできるようなクラス構造が紹介されてます。
    - 参考にできるソースがあるというのは、正しい実装をしているという自信が持てて良いですね。

# まとめ
　以上私の通ってきた学習ロードマップでした。初心者におすすめする私のイチオシは[UIKit Apprentice](https://www.raywenderlich.com/books/uikit-apprentice/v9.0)ですが、初心者向けの教材は良いものがたくさんあると思うので、好きなものを選んだら良いと思います。その上で挫折しやすい人にはUdemyなどの動画講座をおすすめします。（Udemyのアドベントカレンダー記事というポジショントークじゃないですよ(灬╹ω╹灬)）
　しかし初心者→初中級者向けの教材は少ないと思うので、そういう方には<br>[Twitter iOS Clone \| Swift 5/Firebase \| No Storyboards \| MVVM](https://www.udemy.com/course/twitter-ios-clone-swift/)を強くおすすめしたいです。
　あくまで私の狭い観測範囲で選んだ教材だったり進め方ですので、あくまで一つの参考にしてもらえたらと思います。他におすすめの教材があれば是非コメント等で教えていただけると嬉しいです。
　ここまで読んでいただきありがとうございました。iOS開発は楽しいですよ！