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

