SwiftUI チュートリアル
SwiftUI Essentialsの二つ目をやっていきます。
https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation
リストビューの作成、UIナビゲーションを学んでいくコンテンツのようです。
Listを利用する
Listを使用することでUITableViewのようなリストビューが表示できます。
Listのデータ部分は構造体の配列を利用していました。
構造体は下記のように定義され、ランドマーク情報を表現しています。
struct Landmark: Hashable, Codable, Identifiable {...}
Identifiable
プロトコルについて気になったので調べました。
UITableViewでは自分でどの行にどの情報を表示するかを定義していたが、Listではそれを宣言的に行うため、Identifiableを使用して一意にデータを扱えるようにしているようです。
Identifiableのidプロパティで一意な値を自分で設定することができます。
下記リンクの実装例を見るとUUID構造体を使用することで、実現していました。どの範囲で一意か(アプリの全期間、アプリ起動中、ビュー表示中、etc.)は都度検討する必要があります。
jsonファイルからデータを読み込む
landmarkData.jsonがプロジェクトに配置されているので、それを下記のように読み込んでいます。
guard let file = Bundle.main.url(forResource: filename, withExtension: nil) else {
fatalError("Couldn't find \(filename) in main bundle.")
}
let data: Data
do {
data = try Data(contentsOf: file)
} catch {
fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
}
そしてデコードを行なっています。
do {
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data)
} catch {
fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
}
この処理をグローバルメソッドとして定義していました。
こういったファイル読み込みやパース処理などは頻出するので、切り出しておくのは良いなと思いました。
デコードのエラーハンドリングをいつもtry?で握りつぶしてしまい、パース失敗時にどこで失敗しているのか追いづらくなることが多いので、しっかりエラーログを吐かせているのもいいなと思いました。
Group, ForEach, List
それぞれViewプロトコルに準拠していて、複数のViewを表示する際に利用できます。
Groupは複数のビューをまとめてひとかたまりに扱えるようにできます。一度に同じ修飾子をつけたりできます。また、ViewBuilderのViewが10個までの制約を回避することもできるようです。SwiftUIの独特の記述方法はSwiftのFunctionBuilderによって実現されていて、SwiftUI用にViewBuilderという型が用意されています。このViewBuilderの実装では10個のViewまでしか受け入れられません。11個以上のViewがある場合には、Groupを利用してまとめることで対応が可能のようです。
参考
ForEachとListの違いが気になりました。もう少し勉強を進める必要があります。
Navigation
NavigationViewにListを追加することで、タップ後の遷移を実装することが出来ます。UINavigationViewよりもわかりやすい気がしました。NavigationLinkにて遷移先のViewを渡すことで、指定することが出来ました。
Previewのデバイス指定
Xcode14beta4を使用しているためか、iPhoneSEでのプレビューもiPhoneXSMaxでの表示になってしまいました。iPhoneSE2ndの指定となっていたので、3rdに変更してもうまくいきませんでした。一度Previewが失敗するとエラーで動かなくなってしまいました。。
所感
ナビゲーション処理を繋ぎこむときに、宣言的UIで実装すると抜け漏れが少なく実装できそうだと感じました。それぞれのカスタムビューに必要な情報をinit時に渡していくようになり、必要な情報の渡し忘れなどが減りそうです。リストビューを作る際のUITableViewから脱して記述量が減るのも魅力的です。特に初心者はどこに何が書いてあるかわからないということが多いので、パッと分かるのは大切だと思いました。