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

Swift中如何合并两个forEach?compactMap使用报错求助

解决嵌套forEach转compactMap的类型模糊问题

问题分析

你原来的代码通过嵌套forEach遍历item?.connections和每个连接的validLine,筛选符合条件的Line后收集checkinGroups.connections的ID。直接用compactMap({ $0.validLine })会得到[[Line]]?的二维可选数组,后续没有明确的类型推导链,导致编译器报“Type of expression is ambiguous without more context”错误。

修正后的代码

可以通过展平数组+过滤+批量收集ID的链式调用替代嵌套forEach,既简化代码又解决类型问题:

func getData() -> [String] {
    item?.connections?
        // 过滤掉validLine为nil的连接,得到二维Line数组
        .compactMap { $0.validLine }
        // 把二维数组展平成一维Line序列
        .joined()
        // 筛选符合业务条件的Line
        .filter { line in
            line.connection?.links[LinkKey.dataGroups] != nil,
            let dataGroups = line.dataGroupsCache,
            dataGroups.isContinue
        }
        // 为每个符合条件的Line收集对应ID,自动合并成一维数组
        .flatMap { _ in
            checkinGroups.connections?.compactMap { $0.id } ?? []
        } ?? [] // 处理item或connections为nil的情况,返回空数组
}

关键步骤说明

  • compactMap { $0.validLine }:过滤掉connections中validLine为nil的项,保留非nil的[Line]数组,得到[[Line]]类型。
  • joined():将二维数组展平为一维[Line],替代嵌套的两层forEach遍历逻辑。
  • filter:精准匹配原代码中的条件,只保留需要的Line。
  • flatMap:替代原代码中ids += ...的操作,将每个符合条件的Line对应的ID数组合并成一个一维数组,最终直接返回结果。

内容的提问来源于stack exchange,提问作者New iOS Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:20:32