利用Enum灵活映射多重类型数据模型实例
一个字段中返回了多种相似的类型
先来看下项目中我遇到的一个情况,服务端在人物中返回了一组数据。这些人物有几个相同的属性,但是又有各自不同的角色各有的属性。json数据如下:
{
type: “hero”,
name: “Jake”,
power: “Shapeshift”
},
{
type: “hero”,
name: “Finn”,
power: “Grass sword”
},
{
type: “princess”,
name: “Lumpy Space Princess”,
kingdom: “Lumpy Space”
},
{
type: “civilian”,
name: “BMO”
},
{
type: “princess”,
name: “Princess Bubblegum”,
kingdom: “Candy”
}
]
那么我们可以怎么解析这样的数据呢?
利用类和继承
class Character {
type: String
name: String
}
class Hero : Character {
power: String
}
class Princess : Character {
kingdom: String
}
class Civilian : Character {
}
。。.
struct Model {
characters: [Character]
}
这其实就是项目中我原来使用的方案。但是很快就会觉得有点苦逼,因为使用的时候要不断的类型判断,然后类型转换后才能访问到某个具体类型的属性:
// Type checking
if model.characters[indexPath.row] is Hero {
print(model.characters[indexPath.row].name)
}
// Type checking and Typecasting
if let hero = model.characters[indexPath.row] as? Hero {
print(hero.power)
}
利用结构体和协议
protocol Character {
var type: String { get set }
var name: String { get set }
}
struct Hero : Character {
power: String
}
struct Princess : Character {
kingdom: String
}
struct Civilian : Character {
}
。。.
struct Model {
characters: [Character]
}
这里我们使用了结构体,解析的性能会好一些。但是看起来和前面类的方案差不多。我们并没有利用上protocol的特点,使用的时候我们还是要进行类型判断:
// Type checking
if model.characters[indexPath.row] is Hero {
print(model.characters[indexPath.row].name)
}
// Type checking and Typecasting
if let hero = model.characters[indexPath.row] as? Hero {
print(hero.power)
}
类型转换的潜在问题
上面的这种类型转换可能引入潜在的问题。如果后台此时增加了一个类型对代码会产生什么样的影响呢?可能想到这种情况提前做了处理,也可能没有处理导致崩溃。
非常好我支持^.^
(0) 0%
不好我反对
(0) 0%
下载地址
利用Enum灵活映射多重类型数据模型实例下载
相关电子资料下载
- iOS17.1可能明天发布,iOS17.1主要修复哪些问题? 377
- 拿下国家级信创认证!中科驭数KPU SWIFT-2200N成为国内首款满足金融业严苛要求的 163
- 华为全新鸿蒙蓄势待发 仅支持鸿蒙内核和鸿蒙系统应用 719
- 苹果手机系统iOS 17遭用户质疑 731
- iPhone12辐射超标?苹果推送iOS 17.1解决此事 750
- 传华为囤积零部件 目标明年智能手机出货7000万部;消息称 MiOS 仅限国内,小米 28208
- 苹果推送iOS17.0.3,解决iPhone15Pro系列存在机身过热 216
- Testin云测兼容和真机服务平台中上线iPhone 15系列手机 208
- 利尔达推出搭载HooRiiOS的Matter模组 145
- 运放参数解析:输入偏置电流(Ibias)和失调电流(Ios) 128