iOS SwiftUI List 不偷懒

问题描述 投票:0回答:1

我到处都读到,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 项调用。

我错过了什么吗?

ios list swiftui lazy-evaluation
1个回答
0
投票

它调用

body
来计算每行有多少个
View
。它需要这样做来计算列表的大小。如果每行的视图数量恒定,即确实有任何
if
,那么速度会快得多。这没什么大不了的,
View
结构只是像
Int
这样的值,在性能方面可以忽略不计。只要你不做任何缓慢的事情
body
,例如意外初始化堆对象或排序。

© www.soinside.com 2019 - 2024. All rights reserved.