今天在逛知乎的时候无意间看到这样一个提问 swift中struct怎么转成字典?,心想应该不难实现,正好需要写点Swift练练手,于是乎开始搞起。
首先想到的是将Struct(遵守Codable协议)用JSONEncoder的encode转成Data,然后再用JSONSerialization反序列化成Dictionary对象。
1 | struct Student: Codable { |
在回答完这个问题之后,我又想了一下,这要是每次转换一下,都这么写一遍,那不就疯了吗?
一不做,二不休。继续写代码。
1 | func convertStructToDict<T: Generator where T.Element: |
这次的思路是,封装一个方法,来实现 传入一个遵守Codable协议的Struct或Class实例,经过函数内部处理,返回一个转换好的Dictionary实例出来。
结果编译器报错:1
2
3error: MyPlayground.playground:260:39: error: 'where' clause next to generic parameters is obsoleted
func convertStructToDict<T: Generator where T.Element:
~^~~~~~~~~~~~~~~~
正一筹莫展之时,心想这不能在一棵树上吊死,试试别的方法,说不定可以通过协议扩展的方法来实现。但又不知道协议是否支持继承,经过查找得到了肯定的答案:
图片出处链接:Swift中的Protocol知道这些就够了。
看到这里,心中立马有了方案:
1 | /// 直接将Struct或Class转成Dictionary |
现在只需要新建一个Struct或者Class,然后遵守Convertable协议,这个类或者结构体就获得了一行代码转换成Dictionary的能力,十分的方便,而且使用起来也能确保类型安全。
附上我整理好的代码: github链接