/ios_development_study

:iphone: iOS開発/Swift に関して勉強した記録

📱 iOS開発/Swift に関して勉強した記録

Author oimo23

iOS開発/Swiftについて勉強した記録をするリポジトリです。
以下のドキュメントは時系列順ではなく、勉強カテゴリ別です。

・Repl.itというオンラインエディタ上で実験した
・AtcoderのAB問題を50問解いて文法の練習をした
・Xcode上でプロジェクトを作った
・プロのコードレビューを受けた
・Bitriseを使ってみた
・アプリストアに自作アプリを公開した
・上の中には書いていない、勉強の中でつまづいたところとそれに対する自分なりの理解を書いた
・今後勉強したいこと

という構成です。

基礎的な文法をRepl.it上で勉強

手軽にSwiftを動かせる環境として、Playgroundも良かったが共有も簡単な [Repl.it](https://repl.it/) というオンライン上で使えるエディタのWebサービスを活用した

目的別にググって出てくる記事を見ながらrepl.it上で手を動かして確認した

下記に文法名とリンク先に実際書いて勉強したコード

✅ 変数/定数宣言

https://repl.it/@oimo23/Bian-Shu-Ding-Shu

✅ 配列

https://repl.it/@oimo23/Pei-Lie

✅ 関数定義

https://repl.it/@oimo23/Guan-Shu-Ding-Yi

✅ ループの書き方

https://repl.it/@oimo23/Zao-riFan-si

✅ Math系

https://repl.it/@oimo23/MathXi

✅ map,reduce,filter

https://repl.it/@oimo23/map-reduce-filter

✅ sort

https://repl.it/@oimo23/sototoreverse

✅ struct

https://repl.it/@oimo23/Structtoha

✅ optional型について

https://repl.it/@oimo23/Optionaltoha

✅ Struct

https://repl.it/@oimo23/Structtoha

✅ ClassとEnum

https://repl.it/@oimo23/ClasstoEnum

✅ Exteinsion

https://repl.it/@oimo23/extensiontoha

✅ 循環参照とメモリリーク

https://repl.it/@oimo23/Xun-Huan-Can-Zhao-tomemoririku

✅ Protocolとは

https://repl.it/@oimo23/Protocoltoha

✅ ProtocolでのExtensionによるデフォルト実装

https://repl.it/@oimo23/ProtocolnoextensionwoLi-Yong-sitadehuorutoShi-Zhuang-nituite

AtcoderのAB問題を50問解いて体に馴染ませてみた

プログラミング言語の文法を体に身に付かせるのはAtCoderのAB問題をやるのが一番良いと思った経験からやってみた

そのリポジトリ

✅ 得られたこと

Repl.itで学んだことが体に馴染んだ

✅ 新たに気付いたこと

0除算をするとバグる
配列に対するmax()など 返り値がoptionalなやつがあるので注意しないといけない
optionalの安全なunwrapは guard let unwrapped = mayOptional else { return } でやる?

Xcodeでのアプリ開発

Hello Worldアプリを作った

イメージ
本当にテキストと画像が出るだけ

✅ 得た知識

・アイコンの設定の仕方
・アイコンは解像度別に何種類か用意してあげないといけないこと
appicon generatorというサイトがアイコン作るのに便利だということ
・StoryBoardを使うとPhotoshopとかみたいにGUIでTextやImageを簡単に配置出来た
・SEでビルドしたら、左上がクロッピングされた感じになった ➡︎ AutoLayoutを使えばとりあえず良いと知った

クイズアプリを作った

イメージ 2

おみくじアプリを作った

イメージ 3
そのリポジトリ

✅ 得た知識

・CocoaPodsの使い方、またそれを利用したサードパーティのライブラリの使い方を知った ・SwiftLintの使い方を知った
・MVC、MVPのディレクトリ構造 設計の仕方を自分なりにだが解釈できた
・XCTestを用いたユニットテストのやり方を知った

お天気アプリを作った

イメージ 3
そのリポジトリ

✅ 得た知識

・Alamofireを使ってAPIを叩く方法を知った
・APIから貰ったJSONを整形して画面上に表示する流れを知った
・CoreLocationで位置情報を利用する方法を知った
・Delegateの使い方を知った

Todoアプリを作った

イメージ 3
そのリポジトリ

✅ 得た知識

・Realmを使ってローカルにデータを永続化する方法を知った
・テーブルの使い方を知った

プロのコードレビューを受けた

あるサービスで現場で開発しているiOS開発者にコードレビューを受けた。
有償でやってもらったので、詳細はこのリポジトリには記述しないが、大まかに

・プロジェクト全体で使うConstantな値の管理は、Singletonパターンを適用すると良い
・クロージャ内のselfは[weak self]で弱参照にしないと循環参照になることの具体例
・メインスレッド以外で画面更新を行おうとすると失敗するかクラッシュする

などの知見を得ることが出来た。

App Storeにアプリを公開した

フリマプリ便利計算機

アプリ公開までの流れを知りたくてまずリリースしてみた。
とてもシンプルなのでMinimun Functionsで弾かれるかと思ったが無事審査に通過出来た。

・Developerライセンスの取得
・アプリのアーカイブ
・証明書の設定
・リリース時の情報記入の方法

など実際にリリースする流れを掴むことが出来た

Bitriseを使ってみた

GitHubのリポジトリと連携して、指定したブランチにpushがあったらBitrise側で設定したWorkflowを実行するやり方を知った。
Testの実行と、プロジェクトのアーカイブ、iTunes Connectへのデプロイまで自動化出来た。

基本的なBitriseの知識不足、証明書関係のエラーが出まくり、1週間くらいハマってアプリ自体の開発より辛かった。

iOS開発 / Swift の勉強でつまづいた所と自分なりの答え

❓ Optional型

Swift特有でとっつき辛かった
nil (null) が入っているかもしれない型のこと
Swiftではnilはちゃんと扱わないとアプリが落ちるようだ
String? なら、Stringかnilを許容する

StringとString?は型としては完全に別のもの
Optional型から値を取り出すときにはUnwrapという作業が必要になる

❓ 強参照、弱参照

最初はまったく理解出来なかったが、何回もググったり、Repl上で実験したりコードレビューを受けて少し理解出来た。
循環参照によるメモリリークを防ぐために、弱参照を使用するのだと理解した。
クロージャが絡むと出てくる気がする。

❓ Delegate

delegateはかなり理解に苦しんだけど、実は単にUITextFieldなどのクラスが持っているプロパティ名だと思う。
何かイベントを起きたことを通知してUIViewController側でそれを利用して処理をしたいときに、delegateにUIViewControllerを指定しないと使えない。
そしてUIViewController自身もUITextFieldDelegateに準拠していなければいけないということだと思う。

❓ Protocol

classやstructがどんな関数や変数持ってるか指定するものだと理解した。
普通の変数に対して型が指定されるのに対して、classやstructにはprotocolを指定してやるという事だろうか。

単にふるまいを定義するだけでなく、デフォルト実装というものも指定出来ると後から知った。

❓ Lazy

参照されるとき初めて初期値が設定されるらしい
メモリの節約のため? 画像で言うところ必要な時まで読みこまない lazy load 的な発想から lazy って名前なのだろうか?
正直よく分かっていない

❓ guardってなに?

Optional型の安全なunwrapの時に使うものと理解した

❓ cocoapodsってなに?

パッケージ管理をしてくれる
npmみたいなもの

pod init でファイルが出来て、そこに必要なパッケージの名前を書いて cocoapod install すると入れてくれる

ファイル内で「import ○○」と書くと使えるようになる

❓ 関数の引数のところに付いているアンダースコア(_)は何?

_ をつけると引数名を省略出来るらしい func numberThreeTimes(_ num: Int) -> Int { return num * 3 }

numberThreeTimes(2) // これで良くなる

❓ xcodeproj xcworkspaceの違い

よく分かっていない
cocoapodを使うとxcworkspaceで開く必要があるようだ

❓ classの前の final ってなに?

finalをつけるとそのクラスは継承されないことが保証されるらしい

これから頑張りたいこと

-RxSwift

-ProtocolやEnumを活用したSwiftを有効活用した書き方を使えるようになりたい

-SwiftUI