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

Swift将imageFileNames结构体数组按part分组转字符串数组字典

转换实现方案

直接用Swift原生的Dictionary(grouping:by:)初始化器就能完成分组逻辑,不需要依赖任何第三方扩展,完整实现代码如下:

func convertToGroupedFileNameDict(from source: [imageFileNames]) -> [String: [String]] {
    // 按part属性对结构体数组做分组
    let groupedItems = Dictionary(grouping: source, by: { $0.part })
    
    // 对每组元素做字符串拼接,移除.png后缀匹配目标格式
    return groupedItems.mapValues { itemsInGroup in
        itemsInGroup.map { item in
            let frameWithoutSuffix = item.frame.replacingOccurrences(of: ".png", with: "")
            return "\(item.scene)_\(item.object)_\(item.objectNumber)_\(item.part)_\(frameWithoutSuffix)"
        }
    }
}

调用方式

直接传入你现有的notFinal结构体数组,就能得到符合要求的目标字典:

let goalFinal = convertToGroupedFileNameDict(from: notFinal)

注意事项

  • 你之前用的toDictionary是一对一的键值映射方法,相同键的元素会被后续元素覆盖,所以同part名称下只会保留1条数据,根本不是用来做多元素分组的。系统提供的Dictionary(grouping:by:)就是专门为同键多值的分组场景设计的API,会自动把相同键的所有元素归集到对应数组中,不会出现数据覆盖丢失的问题。
  • 你之前已经写好的convertStructIntoString拼接函数可以直接复用,分组完成后把每个分组对应的结构体数组传入该函数,就能直接拿到对应的值数组,不需要重复写拼接逻辑。
  • 你给出的期望输出示例里没有包含仅存在1个元素的kneeRight分组,如果需要过滤这类单元素分组,在处理值之前加一行过滤逻辑即可:
    let filteredGroups = groupedItems.filter { $0.value.count > 1 }
    
    后续对filteredGroups做mapValues处理,输出结果就和你给出的示例完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:12:05