You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何从ContactDetails数组获取去重公司名称列表?

解决思路与代码优化

问题根源

你之前的错误在于误用了unique()方法:你对单个String(result.company)调用了该方法,但你的unique()扩展是给元素为Hashable的序列(比如数组)设计的,单个字符串的序列元素是Character,完全不是你要的公司名称去重逻辑。同时直接遍历原results数组会导致重复公司重复展示。


方案1:先提取公司名称再去重(保持顺序)

利用你已有的unique()扩展,先把所有联系人的公司名称提取成数组,再去重:

// 先解包results,避免重复使用??
if let results = results {
    // 提取所有公司名称
    let allCompanyNames = results.map(\.company)
    // 调用你的unique方法得到去重后的列表(保持原数组中的出现顺序)
    let uniqueCompanies = allCompanyNames.unique()
    
    List {
        ForEach(uniqueCompanies, id: \.self) { company in
            // 跳转时直接过滤出当前公司的联系人,无需传整个数组
            let companyContacts = results.filter { $0.company == company }
            NavigationLink(
                destination: ProjectContactDetailsView(company: company, results: companyContacts)
            ) {
                Text(company)
            }
        }
    }
}

方案2:按公司分组(更高效,推荐)

如果数据量较大(比如30-40条),用Dictionary分组的方式更高效,无需二次过滤:

if let results = results {
    // 按公司名称分组,key是公司名,value是该公司的所有联系人
    let groupedContacts = Dictionary(grouping: results) { $0.company }
    // 获取去重的公司名称,可按需排序(Swift 5.1+的Dictionary是有序的,会保留首次出现顺序)
    let uniqueCompanies = groupedContacts.keys // 若要排序可改成 groupedContacts.keys.sorted()
    
    List {
        ForEach(uniqueCompanies, id: \.self) { company in
            // 直接从分组字典中取对应联系人,无需过滤
            let companyContacts = groupedContacts[company] ?? []
            NavigationLink(
                destination: ProjectContactDetailsView(company: company, results: companyContacts)
            ) {
                Text(company)
            }
        }
    }
}

额外优化建议

  1. 避免在视图中反复使用results ?? [],先解包results会让代码更清晰且减少不必要的空数组创建。
  2. 详情页直接接收过滤后的联系人数组,而不是整个results,既减少数据传递量,也让详情页逻辑更简洁。

内容的提问来源于stack exchange,提问作者unhep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:48:43