Согласование массива с идентифицируемым в 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
.