Swift中按预算区间(如Under $50)过滤数据的异常排查
问题分析与修复方案
核心问题1:平台过滤逻辑错误
你把预算过滤选项也混入了平台检查逻辑。matchesPlatform 使用 selectedFilters.allSatisfy 时,会把所有选中的过滤项(包括"Under $50"这类预算字符串)都当作平台去检查 campaign.socialLinks 是否包含,而预算选项显然不属于平台链接,导致 matchesPlatform 直接返回 false,最终即使预算符合条件,也会因为平台检查不通过被过滤掉。
核心问题2:预算过滤逻辑不严谨
当前预算过滤的分支只在部分条件下修改 matchesBudget,未覆盖所有场景:
- 比如"Under $50"分支,仅当预算≤50时设为
true,但如果预算>50,matchesBudget会保持默认的true,导致不符合条件的Campaign也被保留; - 其他预算分支仅在不符合时设为
false,但如果同时选中多个预算选项(虽然业务上可能不会,但逻辑上有漏洞),会出现覆盖问题。
修复后的过滤逻辑代码
var filteredCampaigns: [CampaignPostModel] { guard !selectedFilters.isEmpty else { return localCampaignManager.allCampaigns } return localCampaignManager.allCampaigns.filter { campaign in let budgetValue = campaign.budget var matchesBudget = true var matchesPlatform = true // 分离平台过滤和预算过滤的选项 let platformFilters = selectedFilters.filter { !["Under $50", "$50-$100", "$100-$499", "$500 and above"].contains($0) } let budgetFilters = selectedFilters.filter { ["Under $50", "$50-$100", "$100-$499", "$500 and above"].contains($0) } // 平台过滤:仅检查平台类选项 if !platformFilters.isEmpty { matchesPlatform = platformFilters.allSatisfy { campaign.socialLinks.contains($0) } } // 预算过滤:仅处理预算类选项 if !budgetFilters.isEmpty { // 业务上通常只会选一个预算区间,这里默认取第一个选中的预算选项 guard let selectedBudgetFilter = budgetFilters.first else { matchesBudget = false return matchesPlatform && matchesBudget } switch selectedBudgetFilter { case "Under $50": matchesBudget = budgetValue <= 50 case "$50-$100": matchesBudget = budgetValue >= 50 && budgetValue < 100 case "$100-$499": matchesBudget = budgetValue >= 100 && budgetValue < 500 case "$500 and above": matchesBudget = budgetValue >= 500 default: matchesBudget = true } } return matchesPlatform && matchesBudget } }
修复说明
- 分离过滤类型:把选中的过滤项拆分为平台类和预算类,分别处理,避免预算选项干扰平台检查;
- 简化预算逻辑:直接通过赋值判断结果,覆盖所有场景,避免默认值导致的错误;
- 兼容多预算选择:虽然业务上一般只会选一个预算区间,但代码中通过取第一个选中的预算选项处理,避免逻辑冲突;
- 优化代码结构:使用
guard提前返回空过滤的情况,让逻辑更清晰。
内容的提问来源于stack exchange,提问作者Swink
相关产品推荐
相关产品推荐

