如何获取Xcode 13新语法下动态List/ForEach可绑定元素的索引
最优实现方案
你自定义Binding的方案存在额外的全量数组遍历开销,代码冗余度也更高,推荐使用以下两种更优的实现:
方案1:全版本兼容、性能最优
适配所有支持SwiftUI的系统版本,无额外性能损耗:
List(Array(data.enumerated()), id: \.element.id) { index, _ in HStack { Text("\(index + 1)") TextField("", text: $data[index].text) } }
优势:
- 无需自定义Binding,没有全量数组转换的额外开销
- 索引和数据源实时同步,天然避免删除最后一行崩溃的问题
- 只要元素id稳定,列表动画完全正常
方案2:贴合官方推荐绑定语法
适配iOS 15+/macOS 12+(和WWDC21推出的List($data)语法兼容范围完全一致),代码更简洁:
List($data.enumerated(), id: \.element.id) { index, $item in HStack { Text("\(index + 1)") TextField("", text: $item.text) } }
优势:完全贴合官方推荐的元素绑定书写风格,无需手动写数组下标,可读性更高。
注意事项
请始终使用元素自身的唯一属性作为List的id,不要用索引作为id,否则列表增删元素时会出现动画异常、绑定错乱的问题
内容的提问来源于stack exchange,提问作者Adrien
相关产品推荐
相关产品推荐

