第二章——介绍(Swift的特点)

1,932 阅读4分钟

Swift既是一个高层的,也是一个底层的语言。 Swift允许你像写Ruby和Python一样用mapreduce,也允许你很容易的自定义高阶函数。Swift还允许你一些“高速”代码,并直接编译为基于当前平台的二进制码。它具有和C语言一样的高性能。最令我们激动,同时也是我们最佩服Swift的一点是,你可以同时做以上这些事。比如你调用数组的map方法所产生的汇编代码,和直接用for循环产生的汇编代码是完全一样的。

Swift是一个多范型语言。 你可以用它来写面向对象的语言,还可以只用不可变量写纯函数式的代码,你还可以用指针运算完成某些不可避免的、具有C语言风格的代码。

Swift非常灵活。 在介绍《On Lisp》这本书时,Paul Graham写道:

有经验的Lisp程序员会根据情况拆分他们的代码。在遵守“由上至下(top-down)”规范的同时,他们还会采用一种叫做“由下至上(button-up)”的规范。这意味着改变语言本身来适应某个问题。在Lisp中,你不仅根据语言的特性写代码解决问题,还根据问题的需要构建新的语言特性。比如你在编程的时候可能会想:“我要是有某个运算符就好了”,那你就去自己实现一个。然后你就会发现用一个新的运算符可以简化程序另一个部分的设计。如此往复,你的程序和语言共同进化。

Swift和Lisp相隔很久了,但我们感觉Swift借鉴了Lisp这种“由下至上(button-up)”的编程思想,这让写出非常通用、具有高可重用性的底层基础结构变得简单。随后,你可以把这些底层的基础结构进行组合,得到更多特性,最后用于解决实际问题。

Swift的代码简练又不失可读性。 类型推断功能省去了很多无用的类型定义,而这些类型定义其实很明显可以根据上下文推断出来。分号和一些几乎没有价值的插入语也没有了。

Swift鼓励你把更多的事情放在编译期。 Swift会被编译器优化,你也可以助力这一过程。

Swift尽可能保证安全性,除非你人为放弃这一特性。 这一点和C与C++不同(比如你随便忘了些什么,代码就很不安全了),和Java与Haskell也不相同(这些语言不管你愿不愿意,总是安全的)

Eric Lippert是C#的主要作者之一,他最近写了他对于C#最后悔的的十件事,其中之一就是:

有时候你实现了某个特性,而这个特性只有构建了这个语言底层结构的专家才有把握用好。这样的特性应该被醒目地标注为——“危险的”,因为它和另一个语言的某个特性太像了。

Eric指的是C#中的finalizers[1],它和C++的析构函数看上去非常类似,不过它根据垃圾回收器(跑在特定的垃圾回收线程)运行在一个不确定的时间(或许永远都不运行)。而Swift是基于引用计数的,所以他的deinit方法的执行时间是完全确定的。

Swift深刻的体会到了这种情绪,因此,未定义的和不安全的行为默认是被避免的。距离来说,变量在它初始化前不能被使用,越界的数组下表会触发一个陷阱而不是直接访问到内存中的垃圾值。

不过如果真的需要的话,你也有权选择在Swift中写一些“不安全的”代码,比如unsafeBitcast函数或UnsafeMutablePointer类型。极大的自由带来极大的未知,你可以这么写:

let uhOh = someArray.withUnsafePointer { ptr in
// ptr只在block内部有效,不过你也可以把它传到闭包外部
return ptr
}

// later
uhOh[10]

这样你就会得到一个未定义行为,不过你可别说没人提醒过你。

Swift依然具有绝大多数OC的特性, 包括消息发送、运行时类型鉴定、KVO

Swift引入了很多OC不具备的功能。 这其中有些技术和OC的风格兼容的不太好,有时候你会发现你在OC和Swift两个世界中切换有些困难。我们尽可能地将OC和Swift无缝连接起来。

Swift是一个固执的语言。 它是类型安全的,没有基础类型的强制转换。

#译者注: [1]:原文节选的这段话内容太少,其完整背景是这样的:C#的finalizers和C++的析构非常类似,很多人当做了析构函数的C#版本。但由于他们的实现完全不同,很多finalizers的用法会导致难以预料bug,只有真正了解C#原理的人才能正确的使用。所以作者本人对finalizers很后悔。参考资料:Sharp Regrets: Top 10 Worst C# Features