Skip to content

Commit e611cb0

Browse files
committed
Complete ForEachState implementation
1 parent cda32a6 commit e611cb0

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

Sources/OpenSwiftUICore/View/DynamicViewContent/ForEach.swift

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ private struct LogForEachSlowPath: UserDefaultKeyedFeature {
250250
}
251251
}
252252

253-
// MARK: - ForEachState [WIP]
253+
// MARK: - ForEachState
254254

255255
private class ForEachState<Data, ID, Content> where Data: RandomAccessCollection, ID: Hashable, Content: View {
256256
let inputs: _ViewListInputs
@@ -292,7 +292,18 @@ private class ForEachState<Data, ID, Content> where Data: RandomAccessCollection
292292
seed &+= 1
293293
invalidateViewCounts()
294294
if self.view != nil, self.view!.idGenerator.isConstant {
295-
_openSwiftUIUnimplementedFailure()
295+
if self.view!.data.count != view.data.count {
296+
Log.externalWarning("\(ForEach<Data, ID, Content>.self) count (\(view.data.count)) != its initial count (\(self.view!.data.count)). `ForEach(_:content:)` should only be used for *constant* data. Instead conform data to `Identifiable` or use `ForEach(_:id:content:)` and provide an explicit `id`!")
297+
}
298+
let oldData = self.view!.data
299+
self.view = view
300+
self.view!.data = oldData
301+
for (_, item) in items {
302+
item.contentID = contentID
303+
if item.seed == oldSeed {
304+
item.seed = seed
305+
}
306+
}
296307
} else {
297308
self.view = view
298309
edits.removeAll()
@@ -367,7 +378,7 @@ private class ForEachState<Data, ID, Content> where Data: RandomAccessCollection
367378
var index = items.startIndex
368379
let endIndex = items.endIndex
369380
while index != endIndex {
370-
let (id, item) = items[index]
381+
let (_, item) = items[index]
371382
if !item.isRemoved, item.seed != seed {
372383
itemsToErase.append(item)
373384
remainingItemsCount &-= 1

0 commit comments

Comments
 (0)