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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:35:31