search
LoginSignup
5

More than 1 year has passed since last update.

posted at

[swiftui]ForEachでid: \.selfが煩わしい場合のextension

ForEachでループする場合Identifiableのstructを使う方法とid: .selfがあります。
これをしないとui上でどれがどれかプログラム上判断がつかなくなるので仕様として必要になります。

struct Hoge: Identifiable {
    let id: UUID
    var name: String
}

struct Test: View {
    var hoges = [Hoge]()

    var body: some View {
        VStack {
            ForEach(hoges) { hoge in
                Text(text: hoge.name)
            }
        }
    }
}

Identifiableをつけるのがルールであるが、プリミティブな型の場合はできないため、id: .selfが必要になります。

struct Test: View {
    var names: [String]

    var body: some View {
        VStack {
            ForEach(names, id: \.self) { name in
                // do something
            }
        }
    }
}

めんどくさいですよね。extensionで整理

extension ForEach where Data.Element: Hashable, ID == Data.Element, Content: View {
    init(values: Data, content: @escaping (Data.Element) -> Content) {
        self.init(values, id: \.self, content: content)
    }
}

これでこうなります

struct Test: View {
    var names: [String]

    var body: some View {
        VStack {
            ForEach(values: names) { name in
                // do something
            }
        }
    }
}

これで良いね

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
What you can do with signing up
5