什么是Swift中的UnkeyedContainer?
Swift UnkeyedContainer 详解
基本定义
UnkeyedContainer是Swift Codable编解码体系中的核心容器类型之一,是UnkeyedEncodingContainer(编码用)和UnkeyedDecodingContainer(解码用)的统称,专门用于处理按顺序存储、无自定义键的序列型数据,最典型的应用场景就是处理JSON数组。
核心特点
- 内部元素严格按存储顺序排列,读写操作都需要遵循顺序执行
- 没有自定义的CodingKey关联,仅能通过索引定位或者追加的方式操作元素
- 天然支持长度不确定的列表类数据,不需要提前声明元素数量
典型使用场景
大部分时候系统会自动隐式调用UnkeyedContainer处理数组类型的编解码,不需要开发者手动操作,只有需要自定义编解码逻辑时才需要手动调用,常见场景包括:
- 数组内元素类型不统一,需要逐个判断类型后解码
- 需要对序列内的元素做批量预处理,比如过滤非法值、类型转换
- 处理嵌套的无键序列结构
代码示例
比如我们需要手动解码一个纯字符串组成的JSON数组:
待解码的JSON数据:
["北京", "上海", "广州", "深圳"]
对应的解码实现:
struct CityList: Decodable { let cities: [String] init(from decoder: Decoder) throws { // 从解码器中获取无键容器 var container = try decoder.unkeyedContainer() var tempCities: [String] = [] // 遍历容器直到所有元素读取完成 while !container.isAtEnd { let city = try container.decode(String.self) tempCities.append(city) } cities = tempCities } }
如果是编码的场景,也可以通过encoder.unkeyedContainer()获取编码容器,调用encode(_:)方法按顺序追加元素即可。
内容的提问来源于stack exchange,提问作者Mihai Șerban
相关产品推荐
相关产品推荐

