ios - 如何过滤数组中的很多项

标签 ios arrays swift filter

我正在尝试快速过滤一个数组,当我只是想过滤一些东西时它工作得很好但是当我添加到列表时我得到这个错误:

Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions

这是我的错误代码:

filteredArray = workArray.filter { $0.stateName.localizedCaseInsensitiveContainsString(searchString!) || $0.firstName.localizedCaseInsensitiveContainsString(searchString!) || $0.lastName.localizedCaseInsensitiveContainsString(searchString!) || $0.countyName.localizedCaseInsensitiveContainsString(searchString!) || $0.cityName.localizedCaseInsensitiveContainsString(searchString!) || $0.communityName.localizedCaseInsensitiveContainsString(searchString!) || $0.sectionName.localizedCaseInsensitiveContainsString(searchString!) || $0.notes.localizedCaseInsensitiveContainsString(searchString!) || $0.email1.localizedCaseInsensitiveContainsString(searchString!) || $0.email2.localizedCaseInsensitiveContainsString(searchString!) || $0.email3.localizedCaseInsensitiveContainsString(searchString!) || $0.title.localizedCaseInsensitiveContainsString(searchString!) || $0.jobsiteID.localizedCaseInsensitiveContainsString(searchString!)}

我试过像这样拆分这个过程

filteredArray = workArray.filter { $0.stateName.localizedCaseInsensitiveContainsString(searchString!) || $0.firstName.localizedCaseInsensitiveContainsString(searchString!) || $0.lastName.localizedCaseInsensitiveContainsString(searchString!) || $0.countyName.localizedCaseInsensitiveContainsString(searchString!) || $0.cityName.localizedCaseInsensitiveContainsString(searchString!) || $0.communityName.localizedCaseInsensitiveContainsString(searchString!) || $0.sectionName.localizedCaseInsensitiveContainsString(searchString!) || $0.notes.localizedCaseInsensitiveContainsString(searchString!) || $0.email1.localizedCaseInsensitiveContainsString(searchString!)}

filteredArray.appendContentsOf(workArray.filter { $0.email2.localizedCaseInsensitiveContainsString(searchString!) || $0.email3.localizedCaseInsensitiveContainsString(searchString!) || $0.title.localizedCaseInsensitiveContainsString(searchString!) || $0.jobsiteID.localizedCaseInsensitiveContainsString(searchString!)})

但是我在数组中得到了重复的对象。

我可以写一些其他的东西来查找和删除重复的对象,但我宁愿不这样做。我的问题是我应该如何过滤所有这些项目。

谢谢大家的帮助

最佳答案

将表达式的庞然大物分解为数据类型的方法。

extension MyDataThingy {

    func anyFieldContains(searchTerm term: String) -> Bool {

        let fieldValues = [self.stateName, self.firstName, /* etc. */]
        for value in fieldValues {
            if value.localizedCaseInsensitiveContainsString(term) {
                return true
            }
        }
        return false
    }
}

然后:

filteredArray = workArray.filter { $0.anyFieldContains(searchTerm: searchTerm) }

这将修复类型推理引擎的超时错误。它还更具可读性、易理解性和可维护性。

关于ios - 如何过滤数组中的很多项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38927334/

相关文章:

swift - 尝试在 SwiftUI 中使用时,实例方法 'appendInterpolation' 要求 'Decimal' 符合 '_FormatSpecifiable'

ios - UITableViewCell 滚动后数据发生变化

ios - 如何将单个 TableView 单元链接到另一个 ViewController

ios - 身份验证后 Firebase uid 返回 nil (Swift)

ios - 2.10 - iPhone 应用程序还必须以 iPhone 分辨率和 2X iPhone 3GS 分辨率在未经修改的情况下在 iPad 上运行

c++ - 关于循环和数组的练习 - 使用循环 1 次以及如何获取数组的最大值

arrays - Chapel 中数组的分配

Javascript 数组不能作为数组访问

ios - 如何解决 Apple Match-O 链接器错误?

iphone - 以编程方式更改 UIView 大小