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

Swift中筛选嵌套结构体数组并返回子对象的优雅实现

Swift嵌套数组中根据ID直接获取MenuRow的简洁写法

你需要从嵌套的menuSections数组中定位到特定ID的MenuRow,而非其父对象MenuSection,以下是几种符合Swift风格的高效实现方式:

方式一:展平数组后查找(直观简洁)

先通过flatMap将所有嵌套的MenuRow合并为一维数组,再用first(where:)匹配目标ID:

func findMenuRow(by id: Int) -> MenuRow? {
    menuSections.flatMap { $0.menuRows }.first { $0.id == id }
}

这种写法代码量少,但会遍历所有MenuSection和MenuRow后再查找,适合数据量较小的场景。

方式二:惰性遍历提前终止(高效)

利用lazy实现惰性遍历,找到目标后立即停止后续操作,避免不必要的遍历:

func findMenuRow(by id: Int) -> MenuRow? {
    menuSections.lazy.compactMap { section in
        section.menuRows.first { $0.id == id }
    }.first
}

compactMap会过滤掉未找到匹配项的nil结果,lazy确保遍历到第一个匹配的MenuRow就停止,数据量大时效率更优。

方式三:提前终止的循环写法(直观高效)

这种写法逻辑清晰,找到目标后直接返回,无需遍历剩余元素:

func findMenuRow(by id: Int) -> MenuRow? {
    for section in menuSections {
        if let targetRow = section.menuRows.first(where: { $0.id == id }) {
            return targetRow
        }
    }
    return nil
}

如果存在多个相同ID的MenuRow,可以将first(where:)替换为filter,返回[MenuRow]类型的结果。

内容的提问来源于stack exchange,提问作者alex.bour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:25:24