C现代语法与新特性(2)

这个轻量级泛型,一方面会提高代码可读性,让API变得更加清晰。另外一方面,还能使编译器会帮助我们做一些类型检查,找到一些潜在的错误,达到 Type Safety的效果。

日常主要的用法是针对两个集合类的,NSArray与NSDictionary,详细用法可以参考官方SDK中的使用。同时,我们也可以在我们自己的代码来使用这个轻量级泛型,在自定义类,category,extension等等。

自定义类中的使用语法:

Objective-C 的现代语法和新特性

Category / Extension的使用语法:

Objective-C 的现代语法和新特性

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结合在一起,比如官方提供的特性:

Objective-C 的现代语法和新特性

关于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。

Objective-C中@property的所有属性详解

Objective-C 和 Core Foundation 对象相互转换的内存管理总结

使用 Objective-C 一年后我对它的看法

10个Objective-C基础面试题,iOS面试必备

Objective-C适用C数学函数 <math.h>

好学的 Objective-C 高清PDF

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/83e23a8effb167c0300e9aa9563265e8.html