电视剧
objective c(iOS开发生涯的初恋:详解Objective-C多项改进)

当众人的目光聚焦在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)。


顶一下()     踩一下()

热门推荐

发表评论
0评