Swift 5中如何根据ID匹配不同数组模型并获取首个对应名称
Swift实现:为结果匹配首个存在的流派名称
1. 确认数据模型(参考示例)
你已经创建了对应的数据模型,这里给出标准的Codable结构体示例,方便后续操作:
// 单一流派模型 struct Genre: Codable { let id: Int let name: String } // 单个结果模型,新增属性存储匹配到的流派名称 struct ResultItem: Codable { let genre_ids: [Int] let vote_count: Int var matchedGenreName: String? // 用于存储匹配结果 } // 顶层响应模型 struct GenreListResponse: Codable { let genres: [Genre] } struct ResultsResponse: Codable { let results: [ResultItem] }
2. 构建高效的流派映射表
先把流派列表转换成ID到名称的字典,这样后续查找时能做到O(1)的时间复杂度,比反复遍历数组高效得多:
// 假设你已经完成JSON解析,得到流派数组 let genres: [Genre] = ... // 生成ID与名称的映射字典 let genreIdMap = Dictionary(uniqueKeysWithValues: genres.map { ($0.id, $0.name) })
3. 为每个结果匹配首个流派名称
这里提供两种实现方式,都可以满足需求:
方式一:使用forEach遍历修改
直接遍历结果数组,为每个结果找到第一个存在的流派名称并赋值:
// 假设已解析得到结果数组(注意需要是可变数组) var results: [ResultItem] = ... results.forEach { item in // 遍历当前结果的genre_ids,找到第一个在映射表中存在的ID for id in item.genre_ids { if let name = genreIdMap[id] { item.matchedGenreName = name break // 找到第一个匹配项就停止遍历 } } }
方式二:用compactMap + first简化代码
利用Swift的高阶函数,一行代码完成匹配逻辑,更简洁:
results.forEach { item in // compactMap过滤掉不存在的ID对应的nil,取第一个元素就是首个匹配的名称 item.matchedGenreName = item.genre_ids.compactMap { genreIdMap[$0] }.first }
额外:生成新数组(不修改原数组)
如果不想修改原结果数组,可以用map生成包含匹配结果的新数组:
let resultsWithGenre = results.map { item in var newItem = item newItem.matchedGenreName = item.genre_ids.compactMap { genreIdMap[$0] }.first return newItem }
内容的提问来源于stack exchange,提问作者marcos
相关产品推荐
相关产品推荐

