Swiftui - автоматически добавляет разделители между каждым элементом `foreach 'IOS

Программируем под IOS
Ответить
Anonymous
 Swiftui - автоматически добавляет разделители между каждым элементом `foreach '

Сообщение Anonymous »

Я использую foreach для отображения содержимого массива, а затем вручную показывать разделитель между каждым элементом, проверяя индекс элементов. Вот мой код: < /p>

Код: Выделить всё

struct ContentView: View {
let animals = ["Apple", "Bear", "Cat", "Dog", "Elephant"]

var body: some View {
VStack {
/// array of tuples containing each element's index and the element itself
let enumerated = Array(zip(animals.indices, animals))
ForEach(enumerated, id: \.1) { index, animal in
Text(animal)

/// add a divider if the element isn't the last
if index != enumerated.count - 1 {
Divider()
.background(.blue)
}
}
}
}
}
Результат:

это работает, но я добавляю Divid, но я добавляю Divid, но Automale Be Wayers, но Auto Automale, но Automale Ait Automames, но Auto Autherers, но Auto Authers, но Autiders, но Auto Authers, но Auto Autherers, но Auto Autherers. Массив (Zip (Animals.indices, животные)) каждый раз. Вот что у меня есть до сих пор: < /p>

Код: Выделить всё

struct ForEachDividerView: View where Data: RandomAccessCollection, Data.Element: Hashable, Content: View {
var data: Data
var content: (Data.Element) -> Content

var body: some View {
let enumerated = Array(zip(data.indices, data))
ForEach(enumerated, id: \.1) { index, data in

/// generate the view
content(data)

/// add a divider if the element isn't the last
if let index = index as? Int, index != enumerated.count - 1 {
Divider()
.background(.blue)
}
}
}
}

/// usage
ForEachDividerView(data: animals) { animal in
Text(animal)
}
Это отлично работает, изолируя весь код zip coverplate и все еще получить тот же результат. Тем не менее, это связано только с тем, что животные представляют собой массив строки s, что соответствует Hashable - если элементы в моем массиве не соответствовали Hashable , это не сработает:

Код: Выделить всё

struct Person {
var name: String
}

struct ContentView: View {
let people: [Person] = [
.init(name: "Anna"),
.init(name: "Bob"),
.init(name: "Chris")
]

var body: some View {
VStack {

/// Error! Generic struct 'ForEachDividerView' requires that 'Person' conform to 'Hashable'
ForEachDividerView(data: people) { person in
Text(person.name)
}
}
}
}
Вот почему Foreach Swiftui поставляется с дополнительным инициализатором, init (_: id :) , который принимает пользовательский путь ключа для извлечения идентификатора. Я хотел бы воспользоваться этим инициализатором в моем ForeachDividerview , но я не могу понять. Вот что я попробовал: < /p>

Код: Выделить всё

struct ForEachDividerView: View where Data: RandomAccessCollection, ID: Hashable, Content: View {
var data: Data
var id: KeyPath
var content: (Data.Element) -> Content

var body: some View {
let enumerated = Array(zip(data.indices, data))

/// Error! Invalid component of Swift key path
ForEach(enumerated, id: \.1.appending(path: id)) { index, data in

content(data)

if let index = index as? Int, index != enumerated.count - 1 {
Divider()
.background(.blue)
}
}
}
}

/// at least this part works...
ForEachDividerView(data: people, id: \.name) { person in
Text(person.name)
}
Я попытался использовать добавление (path :) для объединения первого пути ключа (который извлекает элемент из перечисленного ) со вторым ключевым путем (который получает Hashable из элемента), но я получил неверный компонент wift -ключа . Foreach , даже если элемент не соответствует Hashable ?

Подробнее здесь: https://stackoverflow.com/questions/725 ... -a-foreach
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»