「株式会社ゆめみ iOS研修」を終えて

初投稿
[株式会社ゆめみさんの公開しているiOS研修](https://qiita.com/watanave/items/1cefa5aae18f5141c426)に取り組みました。
誰かのお役に立てればと思い、研修の感想だったり、参考にしたサイトをまとめてみました。
ちなみに★マークのついているSessionは僕の心が折れたSessionです。
↓↓↓研修資料↓↓↓

https://github.com/yumemi-inc/ios-training

# 各Sessionの感想

## Session1 [AutoLayout](https://github.com/yumemi-inc/ios-training/blob/main/Documentation/AutoLayout.md#autolayout)
* 参考資料が貼られているがSwift初学者からしたら、堅苦しい資料なのでとっつきにくさがある。しかし内容はしっかりしたものなので、ある程度知識を付けてから再度参照するとより理解が深まる。

* 画面は「storyboard」(GUI)と「ViewController」(CUI)で作成が可能。初学者には「storyboard」とコードの共存は難しいと思うので「ViewController」で画面作成をするのをお勧めします。また、Session12で本Sessionの完成形が見られるのでそれも含めてせっかくなら「ViewController」での作成をお勧めする。

#### 参考にしたサイト

* [Auto Layoutをコードで書いてみた](https://qiita.com/dddisk/items/8001598ea7951bcdcc30)

* [UIStackViewとAutoLayoutとUIViewをコードから使ってみるサンプル](https://qiita.com/akira581/items/1a3422f274f29380581e)


## Session2 [天気予報を取得し、表示する](https://github.com/yumemi-inc/ios-training/blob/main/Documentation/API.md#%E5%A4%A9%E6%B0%97%E4%BA%88%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B)
* 完了状態の画面GIFがあるのでかなりやり易い

* 本Sessionはググったり、下記のサイトを参考にすればすぐに達成可能

#### 参考にしたサイト

* [［Swift/iOS］StoryBoardを使わずに、UIButtonを実装する方法](https://qiita.com/tanakadaichi_1989/items/84cdf7ea23b61a462f59)

* [Selector完全攻略、そして初学者特有のAddTarget()やAddObserver()のセレクタに変数を渡そうとする願望について](https://qiita.com/st43/items/43c5c0f5e1f727ba0ff0)

* [画像素材の追加](https://terakoya.site/ios_dic/ios-dic-image-assets/)

* [[Swift] 画像の色を変更する](https://qiita.com/Kon_pippiana/items/78b46d53398681462549)


## Session3 [APIのエラーハンドリング](https://github.com/yumemi-inc/ios-training/blob/main/Documentation/Error.md#api%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AA%E3%83%B3%E3%82%B0)
* do-catch文で場合分けをするだけなのですぐに達成可能。おそらく想定工数よりも早く達成できると思うので、研修資料に貼られているエラー4分類をなんとなくでもいいから理解して取り込むとなお良い。

* 人によっては本Sessionから関数を分けて書くと思う。その際、Swift特有の引数の記述方法などがあるので最初は戸惑うと思う。（外部引数と内部引数など）

#### 参考にしたサイト

* [swift5でダイアログを表示する方法](https://qiita.com/kaneko77/items/010c3836a1a063ad015e)

* [Swiftのdo-try-catch構文](https://www.it-swarm-ja.com/ja/swift/swift%e3%81%aedotrycatch%e6%a7%8b%e6%96%87/1053327613/)


## Session4 [Json文字列を扱う](https://github.com/yumemi-inc/ios-training/blob/main/Documentation/Json.md#json%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E6%89%B1%E3%81%86)
* デコード、エンコードの知識がないとその学習が必要。

#### 参考にしたサイト

* [Swift5でIntをString、Float、Double、NSNumber、Dataに変換する方法](https://program-life.com/1472)

* [【Swift入門】SwiftでJSONを扱ってみよう！](https://www.sejuku.net/blog/34776)


## Session5 [Codable](https://github.com/yumemi-inc/ios-training/blob/main/Documentation/Codable.md#codable)
* 本Sessionは自力だと混乱する内容なので理解者から教わるのがいいと思う。また、構造体を使用するのでその仕組みやメリットも伝えるとより理解が早まる。

#### 参考にしたサイト

* [SwiftでJSONを読込・書出しする方法（Swift4のCodableを利用）](https://medium.com/@bj1024/swift4-codable-json-encode-17eaa95372d1)


## ★Session6 [UIViewControllerのライフサイクル](https://github.com/yumemi-inc/ios-training/blob/main/Documentation/VC_Lifecycle.md#uiviewcontroller%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB)
* iOSアプリの作成に必須の内容なので特に力を入れて取り組むべき。

* ググると、図を用いて説明しているものがあるのでライフサイクルがどういうものか理解するのは容易だと思う。しかし、この仕組みをコードに落とし込むのはなかなか難しい。どのサイクルで何をするのかはある程度決まっているのでまずは自力で取り組み、本Sessionクリア後に定跡のような一般的な知識を教えてもらうといいと思う。

* 起動時に表示する画面が今まで使っていたViewとは違うものになる。その制御がコードのみでなく設定ファイルの編集も必要なのでそこでだいぶつまずくと思う（僕はつまずいた）。エラー文を検索すれば達成可能だが心の折れる人が出るSessionだと思う。

#### 参考にしたサイト

* [[swift4] 起動時に最初に表示させるViewControllerを振り分ける方法 – Bluebear I/O
iOS - 前のViewControllerを削除したい｜teratail](https://blue-bear.jp/kb/swift4-%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E6%9C%80%E5%88%9D%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%8Bviewcontroller%E3%82%92%E6%8C%AF%E3%82%8A%E5%88%86%E3%81%91%E3%82%8B%E6%96%B9/)

* [Swift - storyboardが使われない設定にしているはずなのにcould not find storyboard named "Main"が出てエラーになる。｜teratail](https://teratail.com/questions/214822)

* [ViewControllerのライフサイクル. 本記事では、UIViewControllerのライフサイクルメソッドと、オーバー… | by Satsuki Hashiba | Medium](https://shiba1014.medium.com/viewcontroller%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB-37151427bda5)

* [Storyboardを使わないiOSアプリ開発](https://zenn.dev/kazumalab/articles/76ca59f82c189cf33d43)


## Session7 [NotificationCenter](https://github.com/yumemi-inc/ios-training/blob/main/Documentation/NotificationCenter.md#notificationcenter)
・ググればすぐに達成可能。
・今までホーム画面に移動するという頭がないと思うので本Sessionはテンションの上がる部分だと思う。

#### 参考にしたサイト

* [【Swift】NotificationCenterの使い方](https://qiita.com/ryo-ta/items/2b142361996657463e5f)

* [【xcode 11】新たに導入されたsceneDelegateの各メソッドが呼ばれるタイミング](https://qiita.com/ninoko1995/items/b28a712d5f620dbebb6f)

* [iOSにおけるバックグラウンド処理の全体感](https://qiita.com/chocoyama/items/61dc07bf3312f62fc565)


## Session8 [アプリのテストコード](https://github.com/yumemi-inc/ios-training/blob/main/Documentation/UnitTest.md#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89)
* ここはよりしっかりと学ぶべきSession。ここをなぁなぁで達成するとSession12で辛い思いをする（実際した）。
* 指導者目線だと、少し労力が増えるがProtocolやMock、R.swiftなど惜しみなく全て学習させた方がいいかもしれない。パッケージなしでの達成は可能だがひねくれたコードになってしまったのでR.swift等のパッケージ導入も学習範囲に組み込んでもいいと思う。

#### 参考にしたサイト

* [やさしいSwift単体テスト~テスト可能なクラス設計・後編~](https://qiita.com/yokoyas000/items/327fb2b481738fac4c5a)

* [Swift - UIImageに設定されているリソースの名前について｜teratail](https://teratail.com/questions/118026)

* [Swiftのプロトコル](https://qiita.com/abouch/items/67f9def6dc2feec3e183)


## Session9 [スレッドブロック](https://github.com/yumemi-inc/ios-training/blob/main/Documentation/ThreadBlock.md#%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF)
* ググれば比較的簡単に達成可能。
* 非同期処理はアプリ開発でほぼ100%出るのでしっかり学ぶべき。

#### 参考にしたサイト

* [【Swift】UIActivityIndicatorViewを使う【ぐるぐる】](https://qiita.com/wai21/items/aa105f167bc94a94fe51)


## ★Session10 [Delegateパターン](https://github.com/yumemi-inc/ios-training/blob/main/Documentation/Delegate.md#delegate%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
* Swift特有の仕組みなのでまず理解するのが難しい。検索しても具体例で説明してるサイトはあるが返って分かりづらく、具体例で説明してるサイトも本研修のコードの型に合っていないので紐づけることが難しい。

* 理解者から記述方法やメリットを教わってから作成に取り掛かるのがいいと思う。もしくは、ひたすら検索しまくり、少しずつ知識を積み重ねるか、自分にとってわかりやすいサイトに出会うのを待つ。

#### 参考にしたサイト

* [Swiftのメモリリークについてまとめてみた](https://qiita.com/ryu1sazae/items/201275f9ac3af1ec9e64)


## ★Session11 [コールバック](https://github.com/yumemi-inc/ios-training/blob/main/Documentation/Closure.md#%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF)
* 他の言語にもある仕組みだが触れたのは今回が初なので手こずった。しかし、他人のコードを追えばなんとなく処理内容を理解できるのでそれほど難解なものではないです。人によっては心が折れるだろう部分なので慣れないうちは大変な仕組み。

#### 参考にしたサイト

* [Swiftのクロージャによるコールバックの説明](https://qiita.com/maztak/items/ac668f5d8a47a46b8cb5)

* [Swiftのクロージャについて - RAKUS Developers Blog | ラクス エンジニアブログ](https://tech-blog.rakus.co.jp/entry/2018/04/20/120628)

* [[Swift] クロージャを利用したコールバックの書き方メモ](https://qiita.com/hkusu/items/88033ca593e52f33bfea)


## ★Session12 [アプリの不具合を修正する](https://github.com/yumemi-inc/ios-training/blob/main/Documentation/BugFix.md#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E4%B8%8D%E5%85%B7%E5%90%88%E3%82%92%E4%BF%AE%E6%AD%A3%E3%82%92%E3%81%99%E3%82%8B)
* 本Sessionでは今までで一番大きく心が折れた。特にテストコードを修正する部分で。しっかり今までのSessionを理解しながら進んだ人にとってはおそらくすぐに達成可能な内容になっている。

* 課題文には最低4つの不具合と記載があるが、4つ見つけるのも難しかった。

#### 参考にしたサイト

* [Swift製コマンドラインツールのパッケージ管理ツール「Mint」のセットアップ&操作方法](https://qiita.com/uhooi/items/6a41a623b13f6ef4ddf0)

* [Tips: Mintでのインストールに失敗した話](https://zenn.dev/ueshun/articles/b8373b2e64d288)

* [【初心者向け】swiftのクロージャの省略形が読み慣れない方へ｜ 開発者ブログ ｜ 株式会社アイソルート](https://www.isoroot.jp/blog/3000/)

* [XCTest入門Part2 (Swift) ~非同期編~](https://qiita.com/y-okudera/items/e02b73880b8bc499debe)

* [Swiftで期待値を使用して非同期関数をテストする方法](https://ichi.pro/swift-de-kitaichi-o-shiyoshite-hidoki-kansu-o-tesutosuru-hoho-49003496315337)


# まとめ
* 見出しに★マークのあるSessionは心の折れる可能性があるのでケアが必要だと思います。作業に移る前に概要を説明したり、物によってはみっちり指導した方がいいと思います。
「概要」：Session6、Session11、Session12（Session8がしっかりできているなら）
「みっちり」：Session10、Session12（Session8がしっかりできていないなら）

* Swiftの技術的な研修はそれほど難しくなく、JAVA初心者レベルでもググって自力で進めることが可能だと思います。

* これは個人的なことですが、gitが分からな過ぎてだいぶイライラしてました。人によってはかなりのストレスになるのでケア必須です。Xcodeでgitを操作するようになってからはだいぶ楽に操作できたので最初からそうするのもいいと思いますが、コマンドで操作できるのも重要だと思うので、ある程度コマンドでの操作に慣れてきてからXcode上でのgit操作に移行するのが勉強になると思います。

* 今回使用したゆめみの資料はiOSアプリ開発を網羅的に学べる内容になっているので、研修資料として十分なものだと思います。難易度はそれほど高くなく、Session1からSession11までは基本的に各Sessionで1機能が学べる形式になっていて、段階的に難易度の上がるようなものではありません。Session12が集大成になっていて、今まで学習したことが理解できていれば難しくなく、理解できていなければ難しいものです。また、その理解できていない機能については該当Sessionの復習をすることができる点はこの資料の利点だと思います。

# 編集履歴
| 日付 | 編集者 | 内容 |
|:----|:------|:-----|
| 2021-05-25 | @yzrhr_otogi | 新規作成 |
| 2021-05-25 | @yzrhr_otogi | ★マーク追加 |
| 2021-05-25 | @yzrhr_otogi | 誤字修正 |
| 2021-05-30 | @yzrhr_otogi | 研修資料URL挿入 |

# 以上