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
相关产品推荐
相关产品推荐

