升级至 Xcode 13.3 后针对 SwiftUI 的 ForEach 使用的一个调整

Xcode 13.3 RC 版本已经发布了,和以往一样,我第一时间下载安装并测试了项目,不仅发现编译速度下降了(见此),而且也发现 SwiftUI 项目多了一些 Warning。这个 Warning 便是:Non-constant range: argument must be an integer literal。

Xcode 13.3 Non-constant range: argument must be an integer literal.png

这个 Warning 的字面意思是「非常数范围:参数必须是整数字面量。」所以除非是常数,比如直接用「0..<4」这样的代码消除这个警告,但是大多数情况下,我们不可能去这样写,因为这部分 View 就是动态生成的。

那么如何正确消除这个 Warning,还是要回到原始文档去找答案:ForEach/init(_:content:)

The instance only reads the initial value of the provided data and doesn’t need to identify views across updates. To compute views on demand over a dynamic range, use ForEach/init(_:id:content:).

简单地说,这个方法只会读取提供数据的初始数,如果你不需要 View 在之后发生变化,那么可以用这个方法,不然推荐使用 ForEach/init(_:id:content:).

所以只要把代码改成下面这样就可以了:

ForEach(0..<features.count, id: \.self) { (index) in
    FeatureView(text: features[index])
}
这样,不仅不会有警告,而且动态创建的 View 将会受 SwiftUI 来通过 id 来唯一标识,需要动态增加和变化的话,不会重复进行创建,消除了运行过程中可能遇到的异常。

欢迎使用图拉鼎和他的团队开发的作品

效率控 - 聚合众多实用小工具

装机必备的高颜值工具箱,拥有超过 18 款工具,完成日常各类任务。支持 iPhone、iPad 和 macOS。

3 Comments

Frank

棒,谢谢分享。

Heo

成功解决,感谢

Leave a Comment