这个轻量级泛型,一方面会提高代码可读性,让API变得更加清晰。另外一方面,还能使编译器会帮助我们做一些类型检查,找到一些潜在的错误,达到 Type Safety的效果。
日常主要的用法是针对两个集合类的,NSArray与NSDictionary,详细用法可以参考官方SDK中的使用。同时,我们也可以在我们自己的代码来使用这个轻量级泛型,在自定义类,category,extension等等。
自定义类中的使用语法:
Category / Extension的使用语法:
WWDC中还强调了一点是,Lightweight Generics 是向前兼容的,不会更改OC的runtime,同时也不会对生成的代码造成任何影响。
__kindof在OC中,我们的代码中会大量使用id这个特性,这个特性用起来会带来很多很方便的特性,但是它有个缺陷,我们经常需要进行强制类型转换。 Xcode 7中有个新特性,__kindof,“Kindof” types express “some kind of X”,用__kind修饰的变量表示是某个类或者这个类的子类。
当我们把这个类或者子类的其他变量赋值给这个变量时,编译器会默认帮我们进行类型转换以及类型检查工作,这样就不需要我们写一些强制类型转换这样 的代码了。最简单的一个例子是在UITableView的应用,cellForRowAtIndexPath:返回的变量使用这个修饰之后,我们就不再需 要写任何强制类型转换了,例如,CustomCell *cell = [tableview cellForRowAtIndexPath:indexPath];
同时,我们可以将Kindof types和lightweight generics结合在一起,比如官方提供的特性:
关于id类型看了上面这些新特性之后,你会发现在平时开发中,你真的还需要那么多id吗?大多数情况下,我们都可以使用一个更加精确的类型表示,这样能避免一些例如 type safety的问题,同时也能让代码更加清晰。下面看一下官方指明的替代id的情景:
在返回 “self” 的方法中,使用instancetype来代替id
大多数 Collections 都可以变成 Typed Collections 来代替id
__kindof X * 来表示 “some subclass of X”,而不再使用id,可以减少类型强制转换之类的代码
id 表示conforms to SomeProtocol的任意类型
那什么情况下使用id呢?只有那些你确认要表示”an object of any type”的时候再使用id,否则,尽量使用其他语法代替id。