Swift中筛选嵌套结构体数组并返回子对象的优雅实现
你需要从嵌套的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
相关产品推荐
相关产品推荐

