Swift 编译器很难处理这个表达式

标签 swift xcode

编辑

问题的根源似乎是使用 .lowercased() 返回小写字符串。将此添加到任何行似乎都会导致 40-60 毫秒的编译时间。


为了加快我的编译时间,我添加了详细的“-Xfrontend -debug-time-function-bodies”标志 here以及遵循优化提示 here

编译器似乎很难处理过滤函数,例如:

    // Filter by search term
    if self.searchController.isActive {
        filteredManualTasksArray = self.filteredManualTasksArray.filter() {
            let taskName:String = $0.bmTaskName!.lowercased()
            let searchText:String = searchController.searchBar.text!.lowercased()
            return taskName.contains(searchText)
        }
    }

导致此警告:

表达式用了 51 毫秒来进行类型检查(限制:50 毫秒)

变量 filteredManualTask​​sArray 在别处声明为:

var filteredManualTasksArray:[BMTask]!

据我所知,所有变量都是显式类型的。我可以做些什么来加快速度吗?

编辑:我尝试了几种似乎没有区别的方法

1) 将三行合二为一:

return $0.bmTaskName!.lowercased().contains(searchController.searchBar.text!.lowercased())

2) 指定过滤器类型:

filteredManualTask​​sArray = self.filteredManualTask​​sArray.filter { (task: BMTask) -> Bool in

编辑2

这一行:

let searchText:String = searchController.searchBar.text!.lowercased()

似乎是问题的原因 - 输入检查需要 38 毫秒。我有什么改进方法吗?

最佳答案

您可以将 let searchText 行移出过滤器函数:

if self.searchController.isActive {
    let searchText:String = searchController.searchBar.text!.lowercased()
    filteredManualTasksArray = self.filteredManualTasksArray.filter() {
        let taskName:String = $0.bmTaskName!.lowercased()
        return taskName.contains(searchText)
    }
}

关于Swift 编译器很难处理这个表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50737749/

相关文章:

ios - 将 txt 文件读入 iOS 应用程序时出错

ios - 如何在 iOS 中以编程方式激活控件?

objective-c - NSRect 的鼠标事件

ios - UIBarButtonItem 显示为蓝色方 block 而不是我想要的图像(界面编辑器)

ios - Swift - 如何关闭模态然后转到另一个 View Controller ?

swift - 在 Swift 中,如何将 int 转换为字符串并反转并显示结果?

ios - 具有自定义 anchor 的 UICollectionViewFlowLayout Cell 重用过早

swift - 具有相同案例名称且具有不同类型关联值的枚举

xcode Swift 将录制的视频保存为 mov 或 mp4

ios - 如何在 Swift Spritekit 中向我的节点添加触摸和按住手势?