ほぼ未経験フロントエンドエンジニアがSwiftを約1ヶ月でキャッチアップしてみた
導入
業務提携として約10ヶ月ほどフロントエンドエンジニアをした後、新卒入社した会社で初っ端参画したのがまさかのiOSアプリの開発…ということでざーっとキャッチアップしてみました。
何もわからいままとりあえず取り組んだので私と同じようにこの資料を使ってキャッチアップする方の助けになれればと思い、記事を初投稿してみます!
[キャッチアップ資料] 株式会社ゆめみのiOS研修
[ブログを書くにあたって参考にした記事]
Session1 AutoLayout
UIImageViewやUILabel、UIButtonなどを条件に沿って配置し画面レイアウトを作る課題。
初心者の立場からするとmarginやpaddingを使って要素の位置を調整したいなと正直思いつつ、制約とはなんぞやという状態でConstraintも競合しまくるなど初っ端からつまずきました。その後、StackViewなどを利用して何とか問題を解決しました。
[参考資料]
Session2 API
APIを使って天気予報を取得し、表示するという課題。以下の流れでクリアしました。
1 storuboardのUIImageViewやUIButtonをcontrolを押しながらコード側にドラッグして紐づけする(それぞれimageView、reloadButtonとして定義)
2 YumemiWeather.fetchWeatherCondition()
の結果を変数resultに代入 (YumemiWeatherをimportする必要あり)
3 晴れ/曇り/雨のimageをそれぞれ定義
4 resultの結果に応じてimageView.image
に上で定義したimageを代入
[参考資料]
Session3 Error
YumemiWeather
のAPIがエラーをthrowしたときの実装をするという課題。流れとしては
1 APIはランダムでエラーが発生するように設計されているのでAPIを叩くときにdo-catch構文でエラーをキャッチできるようにする
2 APIエラーが発生したらUIAlertController
を表示する
[参考資料]
Session4 JSON
呼び出しAPIをJSON ver
に変更する課題。
APIリファレンスを参照し、どのようにリクエストしレスポンスされるのかを確認する。流れとしては
1 Encodable
を適応したstruct Request
を定義しarea
とdate
を定義する
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?
このような関数を作ってそれぞれエンコード/デコードしました。
[参考資料]
Session5 Codable
Codableの仕組みを利用して、YumemiWeather
のAPIのパラメータを作成し、APIの結果を扱う課題。
1 Encodable
からCodable
に変更しRequestを定義しなおす
2 CodingKeys
を使ってキー名を対応させる
[参考資料]
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の定義し忘れに注意
[参考資料]
Session7 NotificationCenter
NotificationCenterを利用して、アプリがバックグラウンドからフォアグラウンドに戻ってきたときに、天気予報を更新する課題。
NotificationCenterはiOSアプリケーション内のさまざまなイベントや状態の変化を監視し、これらの変化に対する通知を送信する機能を提供するもの!流れとしては、
1 addObserverで通知を受け取るObserverを登録
2 任意のタイミングで通知の監視を解除(removeObserver)
[参考資料]
Session8 UnitTest
テストコードを書く課題。そのためにリファクタリングする。
やることやエラーも多くすごく難しかった印象。正直最初はどこからいじればいいのか分からず、手も足も出なかった。
Youtube等も参照し時間をかけてUnitTest
とはという理解を深めた。
DI
の理解も非常に難しかったが参考資料にある記事はすごくわかりやすかったです。
[参考資料]
Session9 ThreadBlock
呼び出しAPIを変更し、APIの処理が戻るまでUIActivityIndicatorView
を表示するという課題。
このセッションは割と取り組みやすかった印象。
DispatchQueue.global(qos: .userInitiated).async
で囲んでAPIを叩き、DispatchQueue.main.async
内でその結果を反映させる
UIActivityIndicatorViewに関しては以下のようなコードで挙動を制御できる
activityIndicatorView.isHidden
activityIndicatorView.startAnimating()
[参考資料]
Session10 Delegate
Delegateパターンを使ってAPIの結果を受け取り、deinit
を実装してログを出力するようにしておく課題。
ここも難易度が非常に高く未だ理解の浅いセッション。参考資料にあるyoutube動画が非常にわかりやすかったです。
[参考記事]
Session11 Callback
Delegateで受け取っていたAPIの結果を、コールバック形式で受け取るように変更する課題。
APIを非同期的に呼び出し天気情報を取得し、その際コールバックとしてクロージャを渡す
→そのクロージャーは天気情報の取得が完了すると呼び出されるコールバック
callback自体の仕組みは大変わかりやすいが、自分のコードに落とし込む際の理解がやや難しかったです。
[参考動画]
Session12 Concurrency
Delegateで受け取っていたAPIの結果を、コンカレンシー形式で受け取るように変更する課題。
func fetchWeather(_ request: WeatherRequest) async throws -> WeatherData
でfetchしてくる関数を定義し、その中でAPIを叩くがそのときにtry await
のように書くことで、スレッドをブロックすることなく、あたかも同期的に処理が書けるようになる!
[参考動画]
Session13 UITableView
呼び出しAPIのList ver
を使用し、天気リスト画面を作成する課題
このセッションも非常に難しい印象を持ちました。セルの再利用やAPI周りの処理の移植、ViewController
間のデータの受け渡し、pull to refresh
機能の実装などボリュームもあって結構時間がかかってしまいました。
参考資料を参照すれば概ね理解できると思います。
[参考資料]
Session14 UINavigationController
天気リスト画面をUINavigationController
として作成し、詳細画面にはpush
で遷移して戻れるようにし、詳細画面のNavigation Bar title
として選択したエリア名を表示するという課題。
UINavigationController
の理解に時間がかかってしまった。たとえばUINavigationController
は一つ設定するだけで複数のViewController
にも反映されるのかといった初心者疑問を浮かべるも理解が深まることで解決しました。
[参考資料]
Session15 BugFix
main
ブランチの Example/
配下のアプリに最低4つ不具合が潜んでいて、それらを解決する課題
そもそも四つもあるの?という印象でしたがなんとか見つけ、解決することができたので勝手に及第点としました。(何が正解のバグなのかは今でも分からないです…)
自分が取り組んだエラー解決のヒントとしては以下の4点です。
1 特定の操作下でアプリがクラッシュ
2 アラート
3 XCTest
4 通信エラー時の処理
エラーを見つけるのにもその解決にも時間がかかってしまいました。
まとめ
3週間ちょっと、ある程度網羅的にSwiftを学べたと思います。自分はググった後にわからないところはメンターに聞けるという環境であったため、周りの助けもたくさん受けなんとか完遂することができました。
ただ当然まだまだ至らない部分もありますので案件を通して学んだり時間を見つけて自発的に学び続けていこうと思っている次第です。
間違っている箇所も多々あると思いますがご了承ください…最後まで読んでいただきありがとうございました。
Discussion