Swiftのライフサイクルのリサーチ

エンジニアコミュニティで出された第一課題は、

* GitHubにてpublicのリポジトリを作成
* ライフサイクルを調査
* ライフサイクルを出力するアプリを作成する

でした。
課題を頂いてから、一週間で私が取り組んだ内容を記録します。

#GitHubにてpublicのリポジトリを作成
少しは触ったことがありましたが、
イイ機会なので、基礎から学び直しました。
参考にした書籍は
[「わかばちゃんと学ぶ Git使い方入門」](https://www.amazon.co.jp/%E3%82%8F%E3%81%8B%E3%81%B0%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E5%AD%A6%E3%81%B6-Git%E4%BD%BF%E3%81%84%E6%96%B9%E5%85%A5%E9%96%80%E3%80%88GitHub%E3%80%81Bitbucket%E3%80%81SourceTree%E3%80%89-%E6%B9%8A%E5%B7%9D-%E3%81%82%E3%81%84/dp/4863542178)
![wakava.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737820/cb793d44-d540-4358-7192-19a8c6fb9777.jpeg)

##基本的な「よく使う言葉」

* __フォークする__
他の人のコード等を自分のGitHubにコピーすること
* __クローンする__
フォークしたものを自分のPCにダウンロードすること
* __ブランチ__
コミットを指す軽量なポインタ（「今ココ！」みたいな感じ）
* __masterブランチ__
「本流」みたいな意味。本番用の最新のソースコードが保たれるようにする。
* __マージ__
元ブランチに統合させること
* __プッシュ__
GitHubに公開すること
* __コミット__
ローカルに履歴を残すこと
* __プル__
リモートリポジトリからデータを引っ張ってくること
* __コンフリクト__
同じ行に、同時に別々の修正がなされたときに起こる衝突
* __プルリクエスト__
自分がした変更を相手に取り込んでもらうように依頼すること

##使ったツール
* [SourceTree](https://www.sourcetreeapp.com/)
* GitHub

SourceTreeのダウンロードは簡単に出来たけど、
アプリを開くのに苦戦をした。
「安全の確認が出来てないアプリ」と認識され、開けなかった。
[問題解決に参考になったサイト](https://support.apple.com/ja-jp/guide/mac-help/mh40616/mac)

__学び__
Xcodeで直接コミット、プッシュはやったことあったけど、
SourseTreeを使うと変更された箇所や、
コミットしてない項目が可視化されて管理しやすかった。

まだ、使い慣れてないので次週、
もう少し使い慣れるように継続して利用していく。

##ライフサイクルリサーチ
ライフサイクルに関して、共有して頂いたリンクが下記です。
[UIKitのView表示ライフサイクルを理解する](https://qiita.com/shtnkgm/items/f133f73baaa71172efb2)

まだまだ勉強不足の私にとって、
何を書いているのかさっぱりわかりませんでした。

[参考にしたサイト](https://medium.com/@shiba1014/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)
![Pasted Graphic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737820/6ffa08a3-5eef-ab00-a1ce-b885c47437f9.png)
引用元：(https://medium.com/@shiba1014/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)

上図で、なんとなくライフサイクルのイメージがつきました。
>プログラミングは通常
>「機能設計」→「構造設計」→「詳細設計」→「コード化」→「テスト」というプロセスを経ます。
>
>このプロセスのことをライフサイクル（Lifecycle）と呼んでいます。
[引用元サイト](https://itnetinc.co.jp/fns/?p=598)

##第一週：やってみたこと
まず、共有頂いた[UIKitのView表示ライフサイクルを理解する](https://qiita.com/shtnkgm/items/f133f73baaa71172efb2)から
[サンプルプロジェクト](https://github.com/shtnkgm/ViewLifecycleSample)をダウンロード。

それらを、Xcodeでとりあえずrunしてみたけど、エラーで動きません。
__「Swift 3.0」なので、動きませんよー__ と言ったエラーです。

runは諦めて、それぞれのファイルのコードがどうなっているか、解読作業。
![EouKHJDVEAIvwEq.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737820/ab4b015d-25ac-dd6e-408c-b301a14f1b62.jpeg)

おおよその流れ、と
どこに何が、どういう意味で書かれているのかが、わかりました。
Xcodeにて、新規プロジェクトを立ち上げ、
これらのコードを完全にコピーし、ファイルも同じように作成してみたら、
下記のような、出力がされました。

```AppDelegate:application(_:didFinishLaunchingWithOptions:)
GreenView:init()
GreenView:setNeedsDisplay()
GreenView:setNeedsDisplay()
GreenView:setNeedsDisplay()
RedView:init()
RedView:setNeedsDisplay()
RedView:setNeedsDisplay()
RedView:setNeedsDisplay()
ViewController:loadView()
WhiteView:init(frame:)
WhiteView:setNeedsDisplay()
WhiteView:setNeedsDisplay()
WhiteView:setNeedsDisplay()
ViewController:addSubviewsConstraints()
ViewController:viewDidLoad()
ViewController:viewWillAppear(_:)
GreenView:init()
GreenView:setNeedsDisplay()
GreenView:setNeedsDisplay()
GreenView:setNeedsDisplay()
RedView:init()
RedView:setNeedsDisplay()
RedView:setNeedsDisplay()
RedView:setNeedsDisplay()
ViewController:loadView()
WhiteView:init(frame:)
WhiteView:setNeedsDisplay()
WhiteView:setNeedsDisplay()
WhiteView:setNeedsDisplay()
ViewController:addSubviewsConstraints()
ViewController:viewDidLoad()
ViewController:viewWillAppear(_:)
WhiteView:setNeedsLayout()
WhiteView:setNeedsLayout()
WhiteView:setNeedsLayout()
WhiteView:setNeedsLayout()
WhiteView:setNeedsLayout()
WhiteView:setNeedsLayout()
RedView:setNeedsLayout()
WhiteView:setNeedsLayout()
RedView:setNeedsLayout()
RedView:setNeedsLayout()
RedView:setNeedsLayout()
WhiteView:setNeedsLayout()
WhiteView:setNeedsLayout()
GreenView:updateConstraints()
RedView:updateConstraints()
ViewController:updateViewConstraints()
WhiteView:updateConstraints()
WhiteView:setNeedsLayout()
WhiteView:setNeedsLayout()
WhiteView:setNeedsLayout()
WhiteView:setNeedsLayout()
WhiteView:setNeedsLayout()
ViewController:viewWillLayoutSubviews()
WhiteView:layoutSubviews()
ViewController:viewDidLayoutSubviews()
RedView:layoutSubviews()
GreenView:layoutSubviews()
WhiteView:draw(_:)
RedView:draw(_:)
GreenView:draw(_:)
WhiteView:setNeedsLayout()
ViewController:viewDidAppear(_:)
ViewController:viewDidAppear(_:)
```
ただ単にコピペしただけなので、
同じメソッドが複数回printされました。
また、画面をタップすると下図のようになりました。
![スクリーンショット 2020-12-07 22.28.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737820/bc2d3ec5-282c-961a-10d2-33b53220ce1e.png)

今まで、storybordで作るものと思っていたら、
コードをコピーしただけで、このような画面が出てきた。
画面に表示される赤と緑の四角も、コピペしたら出てきたので、
コードでオブジェクトを表示することができることを、今回初めて知った。



##学んだこと
* ファイル名の並び順を変えたとしても、実行される順番は変わらない。
* Swift3.0からマイグレーションしないと、エラーになる。
* 「アプリを作る」と言われ、printした内容をiPhoneの画面内で表示されるアプリと思い込んでいた。
* 「アプリ」はiPhoneの中のアプリではなく、プロジェクトそのものを指す。
* コードだけでオブジェクトが表示される。


##現在の課題と次週の目標
今日まで一週間で行動したことから、
今日から一週間で挑戦してみることをまとめる。

__現状でわからないこと__

* ブランチの仕方は、合っているのかどうか。
* 課題から逸れるけど、出力されたライフサイクルをアプリ内で表示することは可能なのか。
* このレベルでコミュニティにいていいのか。

__課題__

* Xcodeに慣れてなさすぎる、勉強不足
* SourceTreeも各ボタンの意味や使い方が、まだ完全に理解できていない

__今後の取り組み___

* 途中で止まっているXcode入門動画を手を動かしながら見る。
* 課題を優先して止まっていた「Swift実践入門」の参考書を少しでも毎日やる。
* わかばちゃんの参考書の飛ばした箇所をやってみる。

今日から一週間の取り組みは、改めてここに追記する。