Согласование массива с идентифицируемым в SwiftUI

У меня небольшой вопрос о соответствии с SwiftUI.

Бывают ситуации, когда от нас требуется соответствие заданному типу MyType.

Но я столкнулся со случаем, когда мне требуется, чтобы [MyType] (массив MyType) соответствовал.

У меня MyType уже соответствует требованиям. Что мне нужно сделать, чтобы [MyType] соответствовал Identifiable?

2 ответа

Предлагаю встраивать [MyType] в структуре, тогда структура должна соответствовать Identifiable. Что-то вроде этого:

      struct MyType: Identifiable {
    let id = UUID()
}
struct Container: Identifiable {
    let id = UUID()
    var myTypes = [MyType]()
}

Применение:

      struct ContentView: View {
    let containers = [
        Container(myTypes: [
            MyType(),
            MyType()
        ]),
        Container(myTypes: [
            MyType(),
            MyType(),
            MyType()
        ])
    ]
    
    var body: some View {

        /// no need for `id: \.self`
        ForEach(containers) { container in
            ...
        }
    }
}

Вы можете написать расширение, чтобы соответствовать Array к Identifiable.

Поскольку расширения не могут содержать сохраненные свойства, а также потому, что два массива, которые являются «одинаковыми», также имеют одинаковое значение, вам необходимо вычислить значение на основе содержимого массива.

Самый простой подход здесь - если вы можете соответствовать своему типу:

      extension MyType: Hashable {}

Это также делает [MyType] соответствовать, и поскольку может быть любой Hashable, вы можете использовать сам массив как собственный id:

      extension Array: Identifiable where Element: Hashable {
   public var id: Self { self }
}

Конечно, вы можете сделать это только для своего типа where Element == MyType, но этот тип должен быть public.

Другие вопросы по тегам