Cover Image for MIXIの新卒向けiOS研修(2023年版)やってみた

MIXIの新卒向けiOS研修(2023年版)やってみた

概要

SwiftUI Tutorials やってみたTwitter-Clone-SwiftUI 写経してみた をやってみて、実践的かつ体系的に SwiftUI を勉強したくなったので mixigroup/ios-swiftui-training をやってみる

memo

0. Swift言語の基本

  • 初っ端から Playground を使えるのを知らないことに気づいた
    • こんなんあったんや
  • Optional の説明が丁寧でとてもわかりやすい
  • クロージャーの省略の説明の流れもとてもいいなー
    • 急に $0 出てきて混乱してた頃の自分に教えてあげたい
  • 弱参照はここで初めて知った
  • 例えば、同じような機能を複数箇所に持たせたい場合、間違ってもclassの継承を使って実現せずに、Swiftではprotocolによる共通化を心がけてください

    • とてもいい
  • (追加で調べたこと)
    • swift の Optional には zip がない

1. SwiftUIの基本

前準備

  • Organization Identifier 何に使うのとか最初悩んだので、説明されてるのとてもいい

1.1. 簡単なレイアウトを組む

  • GUIから左寄せにできるやつ、便利なんだと思うけどサーバーサイドから来た人間からするとちょっと違和感がまだ拭えない...
    • GUIをいじってコード書き換わるのが、なんか再現性がなくてやだな...ってなる気持ちがまだある

1.2. 画像を表示

  • assets に D&D で画像追加するのもなんか慣れないんだよなー
    • 実態がどこにあるのかわからないのが不安になる
    • xcodeでコード書いてて不安なのは、「実態がどこにあるのかわからない」が9割ぐらいな気がする
  • 内容と関係ないけど GitHubMarkH が大文字なの気になる
  • GUIからいじるの慣れないけど、fontサイズとか指定するのはこれ良いかもしれない
    • 変更しながらサイズ調整するみたいなやつは向いてるんじゃないか

1.3. リスト表示

  • Identifiable 周りの説明あって助かった
  • 最終成果物に HStack が足りてなくてプレビューと合わないの
    • わざとやってるのかも?
  • Extract Subview で切り出せるのは便利
    • だけど Intellij IDEA に比べるとリファクタ機能弱め
    • 切り出した Subview が普通にエラーになる

1.4. ナビゲーション

  • Preview Content はデフォルトで Development Assets として設定されているため、プロダクションのバイナリに含まれることはありません

    • これは知らなかった、mock置き場に困ってたから助かる
  • User+mock.swift
    • +mock をつけるのは普通の文化なんだろうか?
    • Hoge+fuga.swift の命名規則はこのようにextensionメソッドを生やす際によく用いられます

      • 書いてあった
  • 若干 Preview の書き方が古いかも?
    • #Preview でよさそう
  • Optional Binding 周りのコードも絶妙み間違ってる
    • let が足りないし、bindしたdescriptionを使ってない
  • SpacerをVStack, HStackの中で宣言すれば、Stackが画面いっぱいに広がり、Spacerを宣言した部分に余白ができるレイアウトになります

    • これが難しい
  • NavigationViewに対してではなく、その内部のViewに対して navigationTitle のmodifierを宣言することに違和感を感じるかもしれませんが、NavigationViewの中のViewは画面遷移をするごとに変わるため、その中身に応じてタイトルを決めると考えるならばむしろ自然な定義といえます

    • なるほど?
    • こういう文化なんだと理解する必要がありそう

1.5. ライフサイクルと状態管理

  • Viewのライフサイクル
    • 説明欲しいと思ってたやつ〜、助かるー

2. WebAPIとの通信

2.1. Swift Concurrencyによる非同期処理

  • 非同期処理
    • これが知りたかったやつ
  • reposStore できてないところで、使われてて一部サンプルが動かない
  • onAppear() { Task {...} }.task{ ... } が等価
    • シンタックスシュガー多くてむずい
    • 慣れるとわかりやすいんだとは思う
  • ObservableObject
    • view から変更を監視することができる
    • @Published がついているプロパティが ObservableObject 内で監視可能なもの
      • = View から見た時のStateになるってこと?
    • @StateObject で View と紐づける
      • @State は View 内で管理された state
      • @StateObject は view 外の state への参照
      • ってこと?
  • UIの更新は Main Thread でやらないといけない
    • 通信は background でやっていいけど Viewに反映するタイミングは気をつけないといけない
    • ここは難しい

2.2. URLSessionによる通信

  • Decodable で異なる名称を使いたい場合

2.3. エラーハンドリング

  • だいぶ見通し悪いコードだけどこれでいいの?
    • と思ったら最後にリファクタリングが示唆されていた

3. 設計とテスト

3.1. MVVMアーキテクチャ

  • MVVMなんとなくしか分かってなかったので助かる
  • ViewModel に onFoo とか onBar でメソッド定義されてるのなんかしっくりきた
    • うまく言語化できない
  • 関係ないけど project file の diff 見づらいのなんとかならないのか...

3.2. XCTest

  • test から始まるメソッドがテストケースとして認識されて実行されます

    • 好き嫌いはありそう
    • アノテーションつけるよりはマシか
  • Repo に Equatable をつけないと、XCTAssertEqual で比較できない
  • テスト実行おっそ
    • Mac Studio (M1 Max) なのでそこそこマシンパワーはあるはずなんだけどな...

3.3. Xcode Previewsの再活用

  • Previews
    • storybookの使い方に近いか
  • Preview できるようにするために → DIできるようにするために → イニシャライザ引数を受け取れるようにする
    • Javaで通った道
    • クラス使わないで関数合成とかができればいいんだけど ViewModel で最終的に State に bindされてるから難しいのか...?