最近在学习swift,我以前是写C#的,后来才转的OC,所以经常会抱怨为啥OC没有泛型呀。现在swift出来了,而且还支持泛型,但是我实在忍不住要吐槽swift下了。
事情是这样的,我们做应用的数据基本都是从服务端获取的,服务端返回的数据也基本都是json格式返回的,然后在客户端把json数据先转成字典或数组。有的项目是直接把转换好的josn字典胡数组拿来用,而大多数的项目应该是进一步的封装,把json数据转换成相应的类实例,这个过程我叫做DTO(data to object)。那怎么把json数据转换后的字典或数组转换成对应的类的实例呢?这里就会用到反射技术了,首先是根据类的名称动态生成对象实例,然后对类的各个属性赋值,而这个赋值的过程也有两种方式,一种是直接使用setValuesForKeysWithDictionary赋值,另外一种是使用反射把类的属性列表给反射出来,然后使用kvc赋值,我再项目中使用的是反射技术。
以上的DTO过程移植到swift中原理也一样,无非就是反射的方法不一样,但具体的原理是一样的。而我遇到的问题出在哪里呢?就出在泛型上面。我先举个例子,看下面代码
class ClassGeneric<T> { var property:T? }
在swift中是可以这样写的, 而这样的代码在C#中也差不多的。为什么这样写,我想用过泛型类的朋友对这样的写法是不会陌生的,但是这样的泛型类在swift中却不支持kvc,如果你用kvc来设置属性的话运行时会报"this class is not key value coding-compliant"。直接把我想通过泛型来做DTO的想法给断了。
另外一个我想吐槽的是swift的反射实在是太弱了,能做的事情太少了。