WWDC2015的明星是Swift。在Swift语言到2.0之后会被开源,这其中包括了protocol扩展和一个新的错误处理API。 苹果的小baby已经长成,而且意料之中的得到了开发者的关注。可是在iOS开发中Object-C并不会很快的推出历史舞台。 而且在WWDC2015中介绍了ObjC的一个很好地特性。咱们下面就来谈一谈ObjC的这个新特性:泛型。objective-c
咱们先看一看下面的代码:swift
很是简单。这里定义了一个名为Person
的类。虽然更应该被定义为一个struct,可是为了和ObjC作对比就先定义为类了。 这个类里面定义了一个属性friends
,一个Person对象组成的数组。Swift的数组是泛型的,能够包括Swift里面有的全部类型。 如今,假设咱们有一个Person的对象,咱们须要他的第一个朋友的名字。数组
编译器知道person.friends
是一个optional的包含Person
对象的数组。因此firstFriendName
是一个可空的字符串安全
很好,那么在ObjC里是怎么样的呢?curl
在咱们继续以前,咱们先来聊一下nonnull和nullable这两个修饰符。这些叫作可空声明,是在Xcode6.3中引入的。 __nullable
能够有nil
或者NULL
值,而__nonnull
不能够。若是你不遵照这些规则,那么是编译不过的。ide
如今,咱们能够回到泛型。咱们没法在friends
数组中定义元素类型。参考Swift的例子,假设咱们有类Person
的对象, 并且咱们须要第一个朋友的名字。因为没有泛型,咱们首先须要取到朋友数组的第一个元素。atom
因为Objective-C里没有泛型,person.friends.fristObject
只能定义为id
类型的,而不是Person
。 id
是一个能够指向任意类型的对象的指针,也就是id
指针指向的对象能够是任意类型的。 咱们彻底不能明确的知道person.friends.firstObject
是一个Person
对象。咱们只能假设person.friends.firstObject
是一个Person
对象, 可是能够是NSString
类型的对象。url
实用正确类型的对象是咱们须要处理的。若是咱们用了一个错误的类型,那么在运行时这个对象会接受到一个不支持的message, 这样就会报错了。要获取第一个朋友的名字,咱们须要初始化另外的一个变量:spa
这个例子很是简单,可是却明显的代表了ObjC须要额外多写一些代码,并且开发者,而不是编译器,须要负责类型的安全。指针
若是说ObjC急需什么Swift或者Java、C#早就已经有的特性的话,那么就必定是泛型了。幸亏,Xcode7带来了一个轻量级的ObjC泛型。
如今咱们能够定义集合里的元素类型了。
编译器知道firstFriendName
是NSString类型的。若是咱们给一个变量赋值一个错误的类型的对象会发生什么呢?
咱们会收到一个warning!
Swift会如何引入这个ObjC的Person
类呢
轻量的泛型不止适用于NSArray
。还适用于其余两个基础集合类-NSDictionary
和NSSet
。
另外,咱们也能够在咱们自定义的类型中使用这些轻量级的泛型:
若是咱们使用错误的类型呢?
Xcode会给出一个警告。
可是有些东西须要注意:ObjC的自定义泛型类和泛型的集合在引入Swift以后行为并不同。 NSArray
、NSSet
和NSDictionary
的类型在Swift中仍是可用的。可是自定义的类的泛型参数在Swift中就不可用了。 全部的自定义类型又变回了AnyObject
。
Xcode7引入了轻量级泛型有什么好处呢?极大地减小了类型转换的代码。类型检测的责任从开发者转移到了编译器。 代码更加干净,类型更加安全。可是,这并非所有。在Xcode7前,Swift调用ObjC的framework要很是当心。 每个ObjC的集合元素都须要从AnyObject
类型作转换。引入了泛型以后就把ObjC和Swift的互操做的这个问题解决了。
from:https://netguru.co/blog/objective-c-generics