梦烟
梦烟
  • 发布:2015-11-19 15:45
  • 更新:2015-11-19 15:45
  • 阅读:1368

2015,Objective-C的这些新改变

分类:流应用
iOS

当众人的目光聚焦在WWDC 2015新推出的Swift 2和iOS 9上时,还有多少人会想起自己初入iOS开发时所看的那一本本Objective-C 资料,如今Objective-C 的种种局限已不复存在,2015年的Objective-C 以全新的面貌重新出现在我们眼前,下面就来看看这位熟悉的旧友有了哪些改变吧。

会弱化Swift代码和可读性

很遗憾,Swift支持泛型(generics)就意味着Objective-C 只会以optional的AnyObject集合的形式出现。如此一来,开发者要使用该属性就必须在Swift和Objective-C之间进行转换。

Nullability Annotations

单单一个属性就引发了这么多担忧,还挺让人不安的。如果代码本身引发很多质疑,出现error的可能性就大大增加,更别提在广为熟知的Objective-C和语言新秀Swift之间相互调用(interoperability)了。现在有了nullability annotations,问题就简单多了,编程也会省下很多麻烦。

@property (strong, nonatomic, nonnull) NSArray *someViews;

intent.大大提升了Objective-C,而且这个属性也不会在Swift里满满都是optional了,开发者看看代码就知道有没有nil pointer了。计算机的静态检验和Swift的可用性都得到了提升,最重要的是实现了API的intent通讯。

泛型的出现,泛型的缺席一直以来是Objective-C开发者心头之痛,而诞生32年之后,Objective-C终于也支持泛型了,支持泛型将带来诸多改变,而且都是积极的改变。

现在可以定义属性,下指令给编译器来显示所有UIView:

@property (strong, nonatomic, nonnull) NSArray<UIView > someViews;

向属性强加UIView之外的东西时,编译器会报错,而且如今不用做大量头痛的转换(cast)了。

Objective-C支持泛型对Swift而言也是好消息。上次更新时,让Swift知道对象不应该是optional的,现在Swift还知道它们是UIViews,如此一来含混不清的AnyObject声明就不需要了。如今的Objective-C可以像C#、C++、Swift等语言一样通过<>括号来表示类型了。虽然通常是对协议表示一致性(conformance),但编译器知道何时、何地以及如何运用它们,且运用是经过推理的。

再进一步,可以用参数来表示扩展(extensions)、类别(categories)和类(classes),好处不仅仅体现在集合(collections)上。泛型的强大体现在整个Objective-C之中,集合仅仅是结果而已。

type erasure不但能实现二进制兼容,而且不改变Objective-C的执行时间。所以开发者们,C#的泛型的确胜过其他语言,这点依旧不会改变,所以发发牢骚就好了。

KindOf Types,再次调用之前定义的属性,就会显示UIView。判断里面包含着views和buttons是再正常不过的事。这种情况下,添加如下代码会发生什么呢?

[self.someViews[0]addTarget:selfaction:selector(aMethod:)
forControlEvents:UIControlEventTouchUpInside];

编译器警告,因为即便可以在这个属性里插入一个button,就算可以假设是个UIView,button也不一定没有经过转换,现在新的KindOf特性能够轻松解决这种始料未及的情况:

@property (strong, nonatomic, nonnull) NSArray<__kindof UIView > someViews;

实际上编译器已经知道了:属性及其集合会出现一些UIView。这样在类型协议里显示更多我们之前看不到的信息,其本质是向下转型(downcasting)。这意味着上述代码编译没什么问题,因为编译器知道集合里肯定会出现一个button,现在那些担忧就都解释得清了。

虽然不喜欢Swift的人可能会刻意夸大Objective-C的优点,但如今两种语言实现了互相调用,这是Objective-C所有提升的最大价值所在,毋庸置疑,Objective-C的确比以往更加强大。

虽然如今Swift正以迅雷不及掩耳之势蚕食着Objective-C,但Objective-C 对每一个iOS开发者来说,就如初恋一般的美好,因此如今Objective-C的提升对开发者而言,是件非常值得高兴的事,它能够帮助开发者写出更好的代码,而且这些优势已经在Foundation中随处可见了。

0 关注 分享

要回复文章请先登录注册