💡

ほぼ未経験フロントエンドエンジニアがSwiftを約1ヶ月でキャッチアップしてみた

2024/05/06に公開

導入

業務提携として約10ヶ月ほどフロントエンドエンジニアをした後、新卒入社した会社で初っ端参画したのがまさかのiOSアプリの開発…ということでざーっとキャッチアップしてみました。
何もわからいままとりあえず取り組んだので私と同じようにこの資料を使ってキャッチアップする方の助けになれればと思い、記事を初投稿してみます!

[キャッチアップ資料] 株式会社ゆめみのiOS研修
https://github.com/yumemi-inc/ios-training.git

[ブログを書くにあたって参考にした記事]
https://qiita.com/yzrhr_otogi/items/c2d14a92f0da480a7ce1

Session1 AutoLayout

UIImageViewやUILabel、UIButtonなどを条件に沿って配置し画面レイアウトを作る課題。
初心者の立場からするとmarginやpaddingを使って要素の位置を調整したいなと正直思いつつ、制約とはなんぞやという状態でConstraintも競合しまくるなど初っ端からつまずきました。その後、StackViewなどを利用して何とか問題を解決しました。

[参考資料]
https://qiita.com/sasao3/items/49e0208cc2347d574eab

Session2 API

APIを使って天気予報を取得し、表示するという課題。以下の流れでクリアしました。

1 storuboardのUIImageViewやUIButtonをcontrolを押しながらコード側にドラッグして紐づけする(それぞれimageView、reloadButtonとして定義)
2 YumemiWeather.fetchWeatherCondition()の結果を変数resultに代入 (YumemiWeatherをimportする必要あり)
3 晴れ/曇り/雨のimageをそれぞれ定義
4 resultの結果に応じてimageView.imageに上で定義したimageを代入

[参考資料]
https://qiita.com/kanae_/items/9df6076a6ab94949439b

Session3 Error

YumemiWeatherのAPIがエラーをthrowしたときの実装をするという課題。流れとしては
1 APIはランダムでエラーが発生するように設計されているのでAPIを叩くときにdo-catch構文でエラーをキャッチできるようにする
2 APIエラーが発生したらUIAlertControllerを表示する

[参考資料]
https://qiita.com/onishi_820/items/cba5e6c7361163d8931e
https://qiita.com/mototaji/items/d1ae68457a118df71458

Session4 JSON

呼び出しAPIをJSON verに変更する課題。
APIリファレンスを参照し、どのようにリクエストしレスポンスされるのかを確認する。流れとしては
1 Encodableを適応したstruct Requestを定義しareadateを定義する
2 指定された地域と日付をエンコードしてJSON文字列を作成しそれをjsonStringに代入
3 jsonStringを引数にAPIを叩きその結果をjsonStringWeatherに代入
4 jsonStringWeatherをデコードしてその結果をweatherDataに代入しUIに反映する

private func encodeFetchWeatherParameter(area: String, date: Date) -> String? 
private func decodeFetchWeatherReturns(jsonString: String) -> WeatherData?

このような関数を作ってそれぞれエンコード/デコードしました。

[参考資料]
https://www.sejuku.net/blog/34776
https://wa3.i-3-i.info/diff397data.html
https://appdev-room.com/swift-json-encoder

Session5 Codable

Codableの仕組みを利用して、YumemiWeatherのAPIのパラメータを作成し、APIの結果を扱う課題。
1 EncodableからCodableに変更しRequestを定義しなおす
2 CodingKeysを使ってキー名を対応させる

[参考資料]
https://qiita.com/s_emoto/items/deda5abcb0adc2217e86

Session6 Lifecycle

新しいViewControllerを追加しそれをアプリ起動時の画面にし、表示されたら今までの画面に遷移させる課題。
1 新しいView Controllerを作成→is initial View Controllerにチェックを入れる
2 override func viewDidAppear(_ animated: Bool)を定義
3 上記の中で let nextVC = storyboard?.instantiateViewController(identifier: "SecondView")とし今まで作っていたViewControllerをnextVCという変数に代入しself.present(nextVC!, animated: true, completion: nil)で遷移するように設定

*identifierの定義し忘れに注意

[参考資料]
https://qiita.com/euJcIKfcqwnzDui/items/d50dc4ec1ccc798fc03e
https://swallow-incubate.com/archives/blog/20200226/?doing_wp_cron=1712728663.3396489620208740234375

Session7 NotificationCenter

NotificationCenterを利用して、アプリがバックグラウンドからフォアグラウンドに戻ってきたときに、天気予報を更新する課題。
NotificationCenterはiOSアプリケーション内のさまざまなイベントや状態の変化を監視し、これらの変化に対する通知を送信する機能を提供するもの!流れとしては、
1 addObserverで通知を受け取るObserverを登録
2 任意のタイミングで通知の監視を解除(removeObserver)

[参考資料]
https://qiita.com/yutosa3/items/89d6295196d24965bb49
https://qiita.com/tajihiro/items/2cd1172976480b3e02cc
https://stackoverflow.com/questions/52316676/type-nsnotification-name-has-no-member-keyboarddidshownotification

Session8 UnitTest

テストコードを書く課題。そのためにリファクタリングする。
やることやエラーも多くすごく難しかった印象。正直最初はどこからいじればいいのか分からず、手も足も出なかった。
Youtube等も参照し時間をかけてUnitTestとはという理解を深めた。
DIの理解も非常に難しかったが参考資料にある記事はすごくわかりやすかったです。

[参考資料]
https://qiita.com/yokoyas000/items/b00012c8b1a84238becf
https://qiita.com/yokoyas000/items/327fb2b481738fac4c5a
https://rookie-programmer.jp/?p=13
https://appdev-room.com/swift-xctest
https://www.youtube.com/watch?v=opkU2UuPk0A&themeRefresh=1

Session9 ThreadBlock

呼び出しAPIを変更し、APIの処理が戻るまでUIActivityIndicatorViewを表示するという課題。
このセッションは割と取り組みやすかった印象。
DispatchQueue.global(qos: .userInitiated).asyncで囲んでAPIを叩き、DispatchQueue.main.async内でその結果を反映させる

UIActivityIndicatorViewに関しては以下のようなコードで挙動を制御できる
activityIndicatorView.isHidden
activityIndicatorView.startAnimating()

[参考資料]
https://qiita.com/spc_knakano/items/5b08fbdfd8df26803687
https://gist.github.com/KentarouKanno/e481b1f6cc298ec07ca1

Session10 Delegate

Delegateパターンを使ってAPIの結果を受け取り、deinitを実装してログを出力するようにしておく課題。
ここも難易度が非常に高く未だ理解の浅いセッション。参考資料にあるyoutube動画が非常にわかりやすかったです。

[参考記事]
https://qiita.com/nitaking/items/d441c5aa2aceaf4fc089
https://www.youtube.com/watch?v=XAWqXC0gMtw

Session11 Callback

Delegateで受け取っていたAPIの結果を、コールバック形式で受け取るように変更する課題。
APIを非同期的に呼び出し天気情報を取得し、その際コールバックとしてクロージャを渡す
→そのクロージャーは天気情報の取得が完了すると呼び出されるコールバック

callback自体の仕組みは大変わかりやすいが、自分のコードに落とし込む際の理解がやや難しかったです。

[参考動画]
https://qiita.com/maztak/items/ac668f5d8a47a46b8cb5
https://qiita.com/hkusu/items/88033ca593e52f33bfea
https://zenn.dev/mhackit/articles/a0b1c6e780c3c6aabe45

Session12 Concurrency

Delegateで受け取っていたAPIの結果を、コンカレンシー形式で受け取るように変更する課題。

func fetchWeather(_ request: WeatherRequest) async throws -> WeatherDataでfetchしてくる関数を定義し、その中でAPIを叩くがそのときにtry awaitのように書くことで、スレッドをブロックすることなく、あたかも同期的に処理が書けるようになる!

[参考動画]
https://zenn.dev/arsaga/articles/ccf24049ea2610
https://zenn.dev/st43/articles/3596e8b3483894

Session13 UITableView

呼び出しAPIのList verを使用し、天気リスト画面を作成する課題

このセッションも非常に難しい印象を持ちました。セルの再利用やAPI周りの処理の移植、ViewController間のデータの受け渡し、pull to refresh機能の実装などボリュームもあって結構時間がかかってしまいました。
参考資料を参照すれば概ね理解できると思います。

[参考資料]
https://qiita.com/yama__0808/items/cecbc6dccaf31db65cb8
https://seeking-star.com/prog/swift/delegate-method-uitableview/
https://qiita.com/ruwatana/items/0598af785f19ed907e81
https://blog.mothule.com/ios/uitableview/ios-swift-uitableview-pull-to-refresh
https://qiita.com/ichikawa7ss/items/df8cd87e66ada42cb560
https://www.youtube.com/watch?v=mF4jeswbTFk

Session14 UINavigationController

天気リスト画面をUINavigationControllerとして作成し、詳細画面にはpushで遷移して戻れるようにし、詳細画面のNavigation Bar titleとして選択したエリア名を表示するという課題。

UINavigationControllerの理解に時間がかかってしまった。たとえばUINavigationControllerは一つ設定するだけで複数のViewControllerにも反映されるのかといった初心者疑問を浮かべるも理解が深まることで解決しました。

[参考資料]
https://qiita.com/am10/items/191a103053f118dcb1ec
https://qiita.com/superman9387/items/c006ced215352f28a7b9
https://swift.tecc0.com/?p=608

Session15 BugFix

mainブランチの Example/配下のアプリに最低4つ不具合が潜んでいて、それらを解決する課題
そもそも四つもあるの?という印象でしたがなんとか見つけ、解決することができたので勝手に及第点としました。(何が正解のバグなのかは今でも分からないです…)

自分が取り組んだエラー解決のヒントとしては以下の4点です。
1 特定の操作下でアプリがクラッシュ
2 アラート
3 XCTest
4 通信エラー時の処理

エラーを見つけるのにもその解決にも時間がかかってしまいました。

まとめ

3週間ちょっと、ある程度網羅的にSwiftを学べたと思います。自分はググった後にわからないところはメンターに聞けるという環境であったため、周りの助けもたくさん受けなんとか完遂することができました。
ただ当然まだまだ至らない部分もありますので案件を通して学んだり時間を見つけて自発的に学び続けていこうと思っている次第です。
間違っている箇所も多々あると思いますがご了承ください…最後まで読んでいただきありがとうございました。

Discussion