Cover Image for Twitter-Clone-SwiftUI 写経してみた

Twitter-Clone-SwiftUI 写経してみた

概要

vipinsaini0/Twitter-Clone-SwiftUI: Twitter Clone in SwiftUI with MVVM and Firebase を写経してみる

写経方針

  • TwitterCloneSwiftUI/ContentView.swift を起点に写経していく
  • エラーになった部分をつど作りながらファイルを作っていく
  • 写経したコードを読んでわからない部分を調べる

学んだこと

SPM関連

  • Kingfisherを追加する必要があるのでどうすればいいのか?
  • FirebaseのSDKも同様の方法で追加した
    • 追加したのに No such module 'Firebase' になる
    • SDK追加時に FirebaseAuth を追加してなかったからだった
    • FirebaseAuth を追加したあと、File > Packages > Resolve Package Versions を押したらエラー消えた
      • 何回かやり直してみたが、reset しないと反映されない時もあり結構不安になる使い心地

xcodeの使い方

  • //MARK: - Login のようなコメント
    • XCode上でセクションを分けて見せれる
    • ナビゲーションバーでもジャンプできるようになる
    • 便利だけど多用するとスパゲティの素なので塩梅が難しそう
  • 色の管理はAssetsにGUIから追加できる
    • テキストファイルで設定させてくれ...頼む...

言語仕様(swift / SwiftUI)

  • おまじないだと思っていた import Foundation がないファイルもある

    • 基本的なデータ型、コレクション、およびユーティリティが含まれているライブラリなのでそれらを使わなければ import しなくても良いらしい
  • swift でも ?. 演算子 (Optional Chaining) は使える

  • @escaping

    • @escaping 属性は、関数やメソッドのパラメータとして渡されるクロージャ(無名関数)が、その関数やメソッドの実行が終了した後も使用される可能性があることを示します
    • Rustの所有権に近いスコープの概念がswiftにもあるっぽい
  • try?

    • Result 型が Error になった時代わりに nil に変換する
  • compactMap

    • mapしてnilを除外する
    • Rustの filterMap 的なもの
  • extension

    • 既存のクラス、構造体、列挙型、またはプロトコル型に新しい機能を追加するための機能
    • JSのプロトタイプ拡張的な感じ?
  • HStack { Spacer() }

    • どういう意図が?と思ったがこれをやると画面幅いっぱいに領域が広がる
    • Spacer() だけだとだめ
    • これはちょっとバッドプラクティス感が否めないな...
  • UITextContentType

    • テキスト入力フィールドの種類を指定できる
    • emailとかpasswordとか適切なものを設定することで入力補助を出したりできる
  • NavigationLink の isActive を使う方法が非推奨になっている

  • RegistrationViewで処理が終わったあと元のページに戻ってリロードする挙動が期待されるが動いてなさそう

    • 一旦放置
  • @StateObjectと@ObservedObjectの違い

    • @StateObject : Viewが表示されてから非表示になるまで
      • @ObservedObject: Viewのbodyが更新される度
  • @Environment(\.presentationMode) var mode

    • mode.wrappedValue.dismiss() のような感じで親(?) のpresentationModeのdismissもできる
  • Viewsome View の整理

    • View はプロトコルとして必ず bodyを持つ
    • なので body 自体は some View を返す
    • some View を返すだけの function や プロパティももちろん宣言できる
      • View ではないが View を構成する部品として使える
    • @ObservedObject など body の更新に反応するモディファイアがあるっぽいので、some View で部品になっているものもありそう

Firebase関連

  • @DocumentID
    • FirestoreのIDと連携するためのアノテーション

ソフトウェアアーキテクチャ

  • completion を引数に受け取る実装は一般的なのか?
    • 写経してるコードは async/await が使われてないのでこうするしかなかったんだと思われる
    • callback地獄の頃のJSを思い出す
  • Service層
    • MVVMアーキテクチャで作られているように見えるが、Service層らしきものがある
    • ViewModelよりさらに純粋なデータ処理をやってるっぽい?
  • Buttonの中でprintしているのはなぜ...?
    • コンソールにログを出しているのでデバッグ目的?
    • productionに出すときに消す方法とかあるのだろうか