本帖最后由 hexue1027 于 2015-4-23 18:39 编辑
编者注:也许有人还记得前些天我们发的一篇翻译文章Cocoa之死,那篇文章的作者是大神Mattt,但那也是他作为管理员在NSHipster上的最后一篇长文了,在那篇文章里,Mattt对Swift充满期许,畅想Swift标准库的完美形态,期待Swift标准库将顺利的继承Cocoa,这也是“之死”说法的由来。本文是Nate Cook所作,可以算是对那篇文章的呼应,他是SwiftDoc.org的创造者,也是继Mattt之后NSHipster的主要维护者,让我们期待新的NSHipster吧。
(原文:Long Live Cocoa 作者:Nate Cook 译者:archerlu) 2015年,新年新开始——这注定是属于Apple Watch和Swift的年份。你或许正期待着新手机,新的XCode beta,也可能正计划着WWDC 2015之旅。别着急,让我们看看今天我们拥有的工具:Objective-C,Swift,还有最重要的,Cocoa。 对部分人来说,Swift是令人激动的编程语言,但它毕竟属于全新事物。Objective-C的成熟稳健,以及Cocoa的悠久历史和强大功能,使得Swift一时之间还无法凌驾其上。Cocoa的内容深度和高效功能,还有如今这种与Swift齐头并进、彼此依存的方式,使得它前景依然光明。实际上,我认为现在正是Cocoa开发者不可错过的时期。 Cocoa拥有优秀出色、颇有深度的API——在它任何常用命令集之下探索,你就会发现一堆功能的宝库。毋须以Mattt为例(这些年来,他工作出众),只需看看Cocoa那些不为人知的功能。仅列举部分如下: - NSLinguisticTagger ,AVSpeechSynthesizer::自然语言接口
- NSCoding , NSKeyedArchiver:简单数据持久化
- NSOperation:面向对象的并发执行
- CFStringTransform:多语种输入的转解码
- NSDataDetector:数据种类的检测
- UIActivityViewController , UIMenuController:本地自定义共享和编辑控制
- NSURL内置的网络缓存
更多列表项见此front page 传承实际上,Cocoa和Swift都为彼此而生——尤其是Swift。 在Cocoa这方面,前几年它向工具集合的转变为Swift的登堂入室铺平了道路。向LLVM/Clang编译框架的转变,Objective-C中block语法的登场,NS_ENUM和NS_OPTIONS宏的出现,初始化构造器现在返回instancetype——几年前就开始的这些步骤,与其说是为我们今天使用的Cocoa API量身定制,不如说是为了与Swift兼容。当你使用NSURLSession的CompletionHandler参数,或UIModalTransitionStyle的completion参数(注:Cocoa中使用block),如同今日使用Swift closure之时,你也在参与这项工程,直到Swift不久前结束秘密研发,走到公众视野之中(或是说从Chris Lattner脑中酝酿成熟)。 Swift原本的设计基础,是与Cocoa共同协作。如果要我指出哪个Swift特性最让新手迷惑——那应该是Optionals——它所带来的额外标点符号,以及待确定的变量值,都相当费解。尽管如此,Swift仍不失为一次成功的革新,像Optionals这类小问题可以略过不提:我们需要知道的是,Swift是一门全新的语言,但它并不需要全新的API。在如今指针和内存大批量存在的环境下,Swift类型安全,内存安全,完成了与数目繁多、基于C语言的Cocoa API直接交互的功能。 这决非区区小事。Apple开发工具团队正致力于给全部API加上注释,为它们的参数和返回值标明内存管理信息。一旦完成,Swift中使用functions就是安全的,因为编译器知道如何在Swift和已注明的C代码之间转换。CFStringRef可以被转换成Swift的CFString实例,但仅在方法被标注时才是安全的。 在Swift中,结构体可以有静态和实例方法,还可以有computed properties(计算属性)。Core Graphics扩展了CGRect之后,那些处理CGRect的功能就更容易查找和使用了 Swift
(译者注:作者大意是,CGRect现在自带处理,已不必到库里去查找或引用) 渐入佳境实话说,Cocoa和Swift有时颇难整合,在那些堪称Objective-C语法标志的地方更加如此。Delegates,target-selector,还有NSInvocation,至今依然占有一席之地。与此不同的是Swift closure,相对容易的closure因其简洁出现在原本需要一整个方法(或许是更多方法)的地方。在现存的Cocoa类中加入更多closure类或block类的方法,可以缓解这个问题。比如,NSTimer的接口要求Objective-C方法,用selector或是invocation传递。当你定义timer时,准备好这个:NSTimer Swift扩展,对接Core Foundation的相应部分,CFTimer,简单快捷。
|