Let's assume we have an Array of objects of type Item:
struct Item {
let customID: Int
let value: String
}
let arrayNew = [
Item(customID: 1, value: "1"),
Item(customID: 23, value: "12"),
Item(customID: 2, value: "32")
]
Now, if we want to access both offset and item from the array, we need to use enumerated():
arrayNew.enumerated()
However, it returns an EnumeratedSequence (and not an Array):
@inlinable public func enumerated() -> EnumeratedSequence<Array<Element>>
If we take a look at the signature of ForEach, we can see that it expects RandomAccessCollection:
public struct ForEach<Data, ID, Content> where Data : RandomAccessCollection, ID : Hashable
The problem here is that EnumeratedSequence doesn't conform to RandomAccessCollection.
But Array does - we just need to convert the result of enumerated() back to an Array:
Array(arrayNew.enumerated())
Now, we can use it directly in the ForEach:
ForEach(Array(arrayNew.enumerated()), id: \.element.customID) { offset, item in
Text("\(offset) \(item.customID) \(item.value)")
}