0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SwiftUI チュートリアルをやっていく その2

Posted at

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から脱して記述量が減るのも魅力的です。特に初心者はどこに何が書いてあるかわからないということが多いので、パッと分かるのは大切だと思いました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?