当众人的目光聚焦在WWDC 2015新推出的Swift 2和iOS 9上时,我的思绪却飘回到办公室书架上。多年前,初入iOS开发时买的Objective-C指导书直至今日还静静地躺在那里,求知若渴地翻动着书页的场景历历在目,心中所想的不是Objective-C的优点,却是它的局限——如今这位老友旧貌换新颜,以往的“局限”不复存在。2015年Objective-C都有哪些提升?这篇文章即将揭晓答案。
下面的代码你们一定再熟悉不过了,我们来重温一下吧:
@property (strong, nonatomic) NSArray *someViews;
是否可能返回nil?
除了UIView之外还有什么?
看样子会出现诸多转换(casting)
会弱化Swift代码和可读性
Nullability Annotations
intent.
再回到实例属性。假设在运行时迭代这个属性来创建某个用户界面,在相应的位置应该有UIButton和UIView。
intent.大大提升了Objective-C,而且这个属性也不会在Swift里满满都是optional了。
计算机的静态检验和Swift的可用性都得到了提升,最重要的是实现了API的intent通讯。
……Objective-C开发者们举国欢庆。呜呼,泛型的恩泽终于笼罩大地,这无疑是那些开发者勇士们的功劳。
现在可以定义属性,下指令给编译器来显示所有UIView:
@property (strong, nonatomic, nonnull) NSArray<UIView *> *someViews;
Objective-C支持泛型对Swift而言也是好消息。上次更新时,我们让Swift知道对象不应该是optional的,现在Swift还知道它们是UIViews,如此一来含混不清的AnyObject声明就不需要了。如今的Objective-C可以像C#、C++、Swift等语言一样通过<>括号来表示类型了。虽然通常是对协议表示一致性(conformance),但编译器知道何时、何地以及如何运用它们,且运用是经过推理的。
刚开始知道类型擦除(type erasure)是为了这个的时候,我有点儿不满意,但考虑到老旧的Objective-C程序堆积在一起的问题,也就释怀了。
KindOf Types
这种情况下,添加如下代码会发生什么呢?
[self.someViews[0] addTarget:self action:selector(aMethod:) forControlEvents:UIControlEventTouchUpInside];
这就对啦,因为即便可以在这个属性里插入一个button,就算可以假设是个UIView,button也不一定没有经过转换。
实际上我们已经告诉编译器:属性及其集合会出现一些UIView。这样在类型协议里显示更多我们之前看不到的信息。其本质向下转型(downcasting)。
现在那些担忧就都解释得清了。
毋庸置疑,Objective-C的确比以往更加强大。
对我来说,Objective-C是开发生涯中的初恋,相比其他语言,它是那么与众不同——直到今天都是如此,它的好、它的坏都让我欲罢不能。虽然如今Swift正以迅雷不及掩耳之势征服着我的心,我还是希望Objective-C陪伴在身边。
(翻译/张新慧 审校/唐小引)
第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。
