编辑
问题的根源似乎是使用 .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 毫秒)
变量 filteredManualTasksArray 在别处声明为:
var filteredManualTasksArray:[BMTask]!
据我所知,所有变量都是显式类型的。我可以做些什么来加快速度吗?
编辑:我尝试了几种似乎没有区别的方法
1) 将三行合二为一:
return $0.bmTaskName!.lowercased().contains(searchController.searchBar.text!.lowercased())
2) 指定过滤器类型:
filteredManualTasksArray = self.filteredManualTasksArray.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/