#この記事を書いた理由
現在Swift UIの勉強をしていますが、Listを作成する機会がとっても多い。
その中で頻出するIdentifiableについて、「頻出だけどあまり理解できていない・・・」と思っていたので、1人でも私と同じような人がいなくなればと思って今回記事にまとめています。
まだ勉強中なので間違えていましたらご指摘いただけますと幸いです。
#目次
1.Identifiableとは?
2.Identifiableが無い時のエラーについて
3.実装してみる
4.まとめ
#Identifiableとは?
そもそもIdentifiableとは何でしょうか。
結論から言うと、構造体に準拠するコンテンツにidを振ることを可能にするプロトコルです。
まだちょっとわかりにくいですよね。
順を追って説明していきます。
プロトコルについての記事はこちら → 現在作成中
構造体についての記事はこちら → 現在作成中
#Identifiableが無い時のエラーについて
Listを作成する際に以下のエラーが出たことないでしょうか。
Initializer ‘init(_:rowContent:)’ requires that ‘xxxx’ conform to ‘Identifiable’
これは、「イニシャライザー init(_:rowContent:) は、xxxx が identifiable に準拠している必要があります。」という内容になり、以下のような場合に発生します。
コードの説明(折りたたみ)
struct ContentView: View {
let animals = ["犬","猫","猿"]
var body: some View {
List(animals){ animal in
Text(animal)
}
}
}
ではなぜエラーが出てしまうのでしょうか?
理由はListの性質にあります。Listのような繰り返し処理でコンテンツを作った場合、そのコンテンツのデータを更新する必要が出た際にどのコンテンツを更新するのか、SwiftUI側がわからないといけません。
そのため繰り返し処理で作成されるコンテンツには、これが更新されるよー!と指定できるように予めidを振ってあげる必要があるのです。
つまり上記のエラーが出たということは、そのidを振ることができないということを伝えているのです。
#実装してみる
では実際に、エラーが出ない形にすると以下のようになります。
struct ContentView: View {
let animals = [Animal(id: 1, name: "犬"), Animal(id: 2, name: "猫"),
Animal(id: 3, name: "猿")]
var body: some View {
List(animals){ animal in
Text(animal.name)
}
}
}
struct Animal: Identifiable {
let id: Int
var name: String
}
先ほどListで表示しようとしていたnameの配列は、Animalという構造体で定義するようにして、AnimalはIdentifiableに準拠し、idというプロパティを持つようにしました。
こうすることでSwiftUI側はプロパティidを使ってどのコンテンツを更新すればいいのかを判断できるようになります。
#まとめ
簡単に言うと、英訳どおりIdentifiable自体には識別可能にする効果があります。
Identifiableプロトコルに準拠した構造体は、idを持っている=idを振ることができる ということになります。
つまり、idを振らせることでSwiftUIへ識別可能にするのです。