Twitter-Clone-SwiftUI 写経してみた
概要
vipinsaini0/Twitter-Clone-SwiftUI: Twitter Clone in SwiftUI with MVVM and Firebase を写経してみる
写経方針
- TwitterCloneSwiftUI/ContentView.swift を起点に写経していく
- エラーになった部分をつど作りながらファイルを作っていく
- 写経したコードを読んでわからない部分を調べる
学んだこと
SPM関連
- Kingfisherを追加する必要があるのでどうすればいいのか?
- UIから追加できそうだけどこれが正式の手順なのか...?
- onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web. のREADME読む限り、このUIから追加する手順が Swift Package Manager の作法らしい
- まじか、project file 的なものに依存書き込まれるのか....不安になるな...
- 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が更新される度
- @StateObject : Viewが表示されてから非表示になるまで
-
@Environment(\.presentationMode) var mode
mode.wrappedValue.dismiss()
のような感じで親(?) のpresentationModeのdismissもできる
-
View
とsome 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に出すときに消す方法とかあるのだろうか