Tenho uma grande variedade de cerca de 50 mil itens, onde cada item está em conformidade com a identificação.
Eu não altero o conjunto de nenhuma forma, nem reorganizo nem nada.
Se eu passasse diretamente para ForEach, o desempenho de rolagem da lista seria significativamente mais suave do que se eu passasse os índices.
Percebo que a documentação menciona algo relacionado à identidade estrutural de cada célula, mas não consigo entender por que isso acontece.
ForEach(myArray, id: \.id) { item in
MyRowView(item: item)
}
// Extremely choppy scroll
ForEach(myArray.indices, id: \.self) { index in
MyRowView(item: myArray[index])
}
Em resumo, o uso
ForEach(myArray, id: \.id)
confere ao SwiftUI uma identidade estrutural para cada item — ele sabe quais são os dados e pode rastrear e reutilizar visualizações com eficiência. Isso resulta em uma rolagem suave, mesmo com matrizes grandes.Em contraste,
ForEach(myArray.indices, id: \.self)
passa apenas números inteiros. O SwiftUI não consegue associar esses índices aos dados subjacentes, então pode recriar visualizações desnecessariamente, resultando em desempenho instável.Esse comportamento é explicado em detalhes no vídeo da WWDC 2021 "Desmistifique o SwiftUI" 23:35