iOS开发技巧系列—使用泛型类来实现数据持久化

445 查看

以前在用C#开发程序的时侯,只要用到数组,必然离不开泛型。再配合集合的扩展方法和LINQ,对于集合数据的操作真是得心应手,非常爽快。后来我转到iOS开发,学会了Objective语言。发现在Objective-C里,一般最常用的数组容器就是NSArray和字典NSDictionary了。可惜这两者都不支持泛型。数据都是以NSObject的类型添加进来,理论上可以保存保存任何的引用类型,这就需要让开发者来确保所有添加的数据类型的一至性。同样的,当从数组容器里取值时,需要将其转化成对应的Model。有时侯还需要进行类型判断。这样的操作不仅增加了代码的复杂性,也很容易出错。而Swift作为一门后起之秀,必然添加了对泛型的支持。弥补了Objective-C对数组操作的安全性,复杂性等的不足,而本篇文章向大家介绍了如果来定义一个泛型类,通过它来作为一种可以永久保存任意数据类型的数据容器,来实现iOS的数据持久化。

什么是泛型

为了更直观一点,首先让我们来看看不支持泛型的Objective-C语言是怎么利用数据容器的

从上面的示例代码可以很清楚地看到,因为Objective-C不支持泛型,所以编译器没有做任何限制,可以在NSMutableArray里添加任何引用类型的数据,这些数据都以id类型保存。在取值时也一样,默认取出来的数据都是id类型,需要将其转化成原先保存的类型才行。这些操作都是需要开发者来确保正确性。如果不小心写错了,编译器也不会给出任何提示或者警告,只有在运行程序时才能触发错误。所以很容易出现隐藏的Bug,同时类型转换也增加了代码的复杂性。

而泛型的出现刚好完全解决了上面的问题:

从上面的代码很容易看出,对于数据类型是Int的数组,只能添加Int类型的数据,其他的数据类型编译器都会报错。取值也一样,取出来的数直接就是Int类型了,不需要再转型了。
而且比较方便的是Swift的数据容器是是可以直接保存值类型的,不需要像Objective-C一样需要将其转成NSNumber了。同样,你也可以声明一个类型为String类型的数组([String]),
或者自定义类的的泛型数组,编译器都会帮你在编码时告诉你正确的数据类型,防止开发者添加错误的数据类型。

使用泛型的优点

使用泛型的优点有很多:

  • 泛型提供了一个强类型的编程模型
  • 编译时的类型检查减少了运行时发生数据类型转换异常的几率
  • 简化了代码,缓解了代码膨胀。
  • 性能得到了提升,不需要在运行时再做类型检查。
  • 代码的可读性更好,并且有更好的代码智能提示。

其实在最新的XCode 7.X中,苹果也悄悄地加入了Objective-C语言的弱泛型支持,见下面代码。