7
4

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.

[Swift]なぜIdentifiableつけるの?

Last updated at Posted at 2022-02-14

#この記事を書いた理由
現在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 に準拠している必要があります。」という内容になり、以下のような場合に発生します

コードの説明(折りたたみ)
下記は let animals = ["犬","猫","猿"] でanimalsという配列を作り、中に犬、猫、猿を格納しています。 次に List(animals){ animal in Text(animal) } で 配列animalsからListのような繰り返し処理でコンテンツを作ろうとしています。
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へ識別可能にするのです。

7
4
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
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?