我到处都读到,List 在 iOS 上应该是 Lazy 的,但以下代码片段似乎与它相矛盾
import SwiftUI
struct Item {
var id: Int
}
let items = (1...30000)
.map { v in
Item(id: v)
}
struct ItemRow:View{
let item: Item
init(item: Item){
self.item = item
print("init #\(item.id)")
}
var body: some View{
Text(String(item.id))
}
}
struct ContentView: View {
var body: some View {
// ScrollView {
// LazyVStack {
// ForEach(items, id: \.id) { item in
// ItemRow(item: item)
// }
// }
// }
List(items, id: \.id) { item in
ItemRow(item: item)
}
}
}
这将打印 30000 次两次(新的空项目)。 还检查了 ItemRow 的主体也立即被所有 30k 项调用。
我错过了什么吗?
它调用
body
来计算每行有多少个 View
。它需要这样做来计算列表的大小。如果每行的视图数量恒定,即确实有任何 if
,那么速度会快得多。这没什么大不了的,View
结构只是像Int
这样的值,在性能方面可以忽略不计。只要你不做任何缓慢的事情body
,例如意外初始化堆对象或排序。