Swift能代替Objective-C吗?
我文章的中心是,以Apple目前给出的各种资料来看,这语言不会替代掉ObjC,它不是下一代的ObjC。它有很多缺点,使得它不足以做大型项目。这些缺点使得,Apple自己都没有使用它做Mac/iOS的app。我不排除明年后年它有很大改进,但至少现在还没有这端倪。
因此,如果你会ObjC,你不需要去看它。
但你如果问我这语言对普通开发者重要不重要,我说重要,可以明确告诉你这一点--它是Apple在WWDC向全世界推出的重磅语言我怎麽能说它不重要?它降低了入门的门槛。使得大量的JS,Python,Ruby用户会使用Apple的技术为其开发程序。它的作用,和CoreData,InterfaceBuilder一样,能让你快速写出一个能用的程序来。但如果你想稍做些正经事,就心有馀力不足了。所以和Apple自己的Mail也不会去用CoreData,自己iPhoto不会去用UICollectionView,稍複杂的App都不会去用InterfaceBuilder一样,Apple自己不会用Swift。它只是给三五个人的小团队能迅速做出能用的程序,让大公司能快速做些Prototype而已。
====
有人说它相当于C#,或是相当于Scala对Java的改进,我可以告诉大家,Swift不是这样的语言。它更像一种让人快速做原型的toylanguage。
要求Apple发佈下一代Objective-C语言的呼声早就有了,每年写数万字OSX评论的ArsTechnica两年前就写了Apple应该去做一个语言,Objective-CwithoutC并且使用更现代的功能和更短的API,以及对自动类型推导的支持,文章见OSX10.8MountainLion:theArsTechnicareview。
但Apple显然没有认真对待这门语言。很明显的,他们根本不想把ObjC给替换掉。并且按Apple的风格,如果他们把Swift当ObjC的未来来对待,肯定会有一到两个iOS/Mac应用使用Swift改写。(比如Apple当年要砍Carbon,首先做的就是把Finder重写了)。
从语言角度,Swift有太多的缺点:
它的标准库太差,只有Dictionary,Array和String及数这几种数据结构,连个Set都没有。想用别的?你还是要用ObjC的。是的,当你用原生数据结构时,速度比ObjC快。但是那仅限于那几个。它没有任何对异步/同步编程的支持。它没法绑定使用GrandCentralDispatch,因此任何正经的网络应用根本无法编写。
它没有任何的保护机制(private,protected),所有的method和variable都是全局可见的,这显然不能满足正经工程项目的需要。
只能和ObjC互动。如果你想正经地使用C或者C++,你得写ObjC的wrapper。这基本限制了你使用大量的C/C++库函数。
没有办法catchObjective-C的exception,如果一旦出了exception,你的App立马就崩了。这也基本限制了你使用很多ObjC旧代码库。
Chris在设计这门语言时,可以明显地看到他的短视。这也很正常,他是一个做编译器的,不是做语言研究的。所以这门声称支持函数式编程的语言,根本没有大多函数式语言都普遍存在的功能:
仅有的支持在lazy,闭包,及简单的函数语言函数(如map,filter)。这ObjC中都能做
没有patternmatching
类型推导差不多和C++11差不多,没有使用hindleymilner
从上面这些特点看,Apple对其的定位仅是给对ObjC头疼的开发者降低学习曲线所推出的玩具语言。前面五条中的每一条,基本都是致命的,因此Apple自己的项目也不会使用。做个早期proofofconcept的prototype到是可以的。
我可以想象,实现上Swift是很简单的(LLVM很成熟了,写个新语言越来越简单,比如只要几步就能做个小语言:1.Kaleidoscope:TutorialIntroductionandtheLexer),当然有可能Apple将来会解决这些问题使得其真正实用。但现在来看,Apple并不希望Swift来替代ObjectiveC。