原文地址css
在过去的几年中,移动应用程序风靡全世界而且已经改变了咱们使用互联网进行工做或者休闲的方式。为了建立移动应用程序,各类技术应运而生,同时开发过程也开始将其做为一等公民来对待。尽管移动彷佛已经无处不在了,可是它的将来才刚刚开始。咱们正面对着新一代的移动设备,例如可穿戴设备以及组成物联网的大量移动工具。咱们将会面对新的用来展现数据和接受命令的用户界面。同时,咱们将会看到愈来愈多的公司真正地实现移动优先。全部的这一切都将会影响咱们在将来的几年中设计、开发和测试软件的方式。html
苹果公司在 WWDC 2014 上发布全新开发语言 Swift——一门针对 iOS 和 OS X 开发的编程语言。不要将苹果的 Swift 与老的并行脚本语言混淆。Swift 的目标是让 iOS 和 OS X 开发变得更简单,更有乐趣。在本文中,我将会解释我认为Swift所具备的最具杀伤力的五个特性,以及为何会这样认为的缘由,虽然这些特性如今依然处于测试阶段,但却值得一试。编程
苹果已经拥有了一门编程语言——Objective-C。那么为何还要引入另外一门编程语言呢?这是由于,虽然 Objective-C 在被建立之初很是独特,同时也很先进,但如今再看,它没有当今语言的味道。例如,在消费者方面,像 Ruby 这样的脚本语言已经被普遍采用,很大程度上得益于它干净的语法。在企业领域,具备类型推理能力的强类型(类型安全的)语言更受欢迎。为了将函数式编程语言所具备的函数即对象、Lambda 表达式等经典特性引进来,C# 和 Java(或者 Scala)等语言都作出了大量的努力。Objective-C 一直都缺乏这类东西,而 Swift 正是为了填补这个空白。swift
Objective-C 是扩充 C 的面向对象编程语言。用于编写 iOS 和 Mac OS X 的操做系统及其应用程序。是 1980 年代初布莱德·考克斯(Brad Cox)在其公司 Stepstone 发明 Objective-C。Objective-C 的流行归功于 iPhone 的成功。数组
这并非说 Objective-C 不是一门优秀的编程语言。实际上,它是一门优秀的语言。可是我确实看到有足够的空间能够成功地替代 Objective-C。进一步讲,同时也要感谢 Swift 的优秀,我认为 Swift 必定会像野火那样迅速蔓延开来。安全
如今,就让咱们看看 Swift 都提供了什么。从语言角度,Swift 很是了不得。苹果借鉴了 Objective-C,Javascript,Python,Scala 和 C# 这些现代语言的优势,构建了一门很是简单,功能很是强大的语言。它很是完美地融合了面向对象和函数式编程范式——说 Swift 是一门函数式语言,是一种极大的延伸。下面就让咱们看看 Swift 最具杀伤力的5个特性。app
从语法上讲,Swift 很是华丽。它是一门很是简单、干净的语言,同时可读性也很是好,即便以如今的标准来衡量也是如此。你立刻就会发如今设计一门语言的时候简单性是一个关键要素。例如,你们所熟知的语句末尾的分号。苹果决定将分号做为可选的,虽然这看起来相关性并非很是强,可是它却让咱们看到了苹果为了尽量地保持语法干净所作出的努力。编程语言
简单性方面的其余例子包括字符串插入,以及对数组和循环的支持。ide
字符串插入函数式编程
var message = "Hello World"
"The message is \(message)" //The message is Hello world
var a = 1, b = 2
"The sum is \(a + b)" //The sum is 3
循环
var length = 10
for i in 0..
数组
var list = ["a", "b"]
list += ["c", "d"]
以上仅仅是 Swift 为简单性提供支持的一部分示例。须要注意的是,你依然可使用 Array 类的“append”方法链接数组,而苹果之因此走了额外的一英里将其构建为语言的一部分目的是为了展现他们设计 Swift 的目标。
若是你想学习 Swift,那么能够尝试下 Xcode 6,它的代码实时预览(Playground)功能太酷了,简直没法用语言形容。实时预览功能让你可以实时地随着你的输入对代码进行测试。它会执行你在开发环境中输入的全部内容,提供与变量值、函数调用返回值以及特定代码块被执行的次数相关的详细信息。
愈来愈多的语言将函数做为一等公民并支持高阶函数。例如,最近发布的 Java 8 引入了 Lambda 表达式。它的理念很简单,就是函数的参数是函数,同时,也能够将函数做为返回值。这样就能够支持更多的抽象。例如,咱们能够将一个“过滤(filter)”函数应用到一个数组,该过滤函数接受数组中的每个条目做为参数,经过特定的标准对条目进行断定从而完成对给定数组的过滤。使用更加通用的方法的关键是可以接受函数类型的参数。下面就让咱们看看定义函数的语法。
Swift 定义函数的语法与传统的 Haskell 这样的函数型语言类似,但并不彻底同样。箭头(->)的左边是参数以及参数的类型,右边是返回值类型。在下面示例中,咱们想要过滤一个数字列表,基于一个给定的数字,返回一个 Bool 类型。这样,函数看起来多是这样的:
(Item:Int) -> Bool
这段代码的含义是,接受一个 Int 类型的参数,返回一个 Bool 类型的值。很显然,你能够包含多个参数,可是不太明显的是,你还能够返回多个值,而这不须要建立一个容器对象。在后面的示例中,函数会返回一个元组 。
一个过滤整数的函数定义多是这样:
func bigNumbersOnly (item:Int) -> Bool {
return item > 3
}
如今,咱们已经建立了本身的过滤函数,下面让咱们看看能够接受函数参数类型的“filter”函数。
var numbers = [1, 2, 3, 4, 5]
var bigOnes = numbers.filter(bigNumbersOnly)
在这个示例中,filter 是一个高阶函数,由于它的参数类型是函数。在 Swift 中,函数也是对象,这意味着咱们能够定义内联函数:
var numbers = [1, 2, 3, 4, 5]
var bigOnes = numbers.filter({(item:Int) -> Bool in return item > 3})
或者咱们也能够将函数赋值给某个变量,稍后再使用它:
//define two variables of type function
var biggies = {(item:Int) -> Bool in return item > 3 }
var threes = {(item:Int) -> Bool in return item == 3 }
//decide which one to apply at runtime
var result = numbers.filter(onlyThrees ? threes : biggies)
当今,将函数做为对象,让用户可以像使用参数那样引用、传递函数已经成为一种优美的标准。而 Swift 实现方式的简洁性依然是一个值得称道的地方,这一核心概念配合类型推理可让你事半功倍。
在企业开发领域,咱们很是习惯于使用强类型(或者说类型安全的)语言。强类型语言一般会给咱们带来一点额外的自信,由于它可以在编译时进行错误检查,若是这些语言也可以支持类型推理那么将会是一种很是好的体验。例如,能够这样:
//Without Type inference
var x:String = "bar"
//With Type inference
var y = "bar"
注意,第二行的语句并无声明变量的类型。由于,Swift 知道“bar”是一个字符串,因此不须要显式地定义它的类型,固然咱们也能够指定,像第一个语句那样。这看起来好像并无特别大的做用,但若是推理的是函数的类型那么它就会变得十分有趣。
若是不使用类型,咱们该如何定义以前例子中的函数呢?下面的代码展示了 Swift 的实现:
//$0 will map to the first parameter, $1 to the second...
var result = numbers.filter({ return $0 == 3})
没有比这更简洁的了!若是你的参数不止一个,同时想要经过名字引用参数,那么能够这样作:
{a, b in return a > b }
Swift 提供的另外一个很是便利的特性是泛型。在企业开发领域,泛型首先被引入到了 C# 中,在得到了大量的关注以后 Java 也引入了该特性。使用泛型可让开发者消除类型转换,由于编译器可以运行特定的类型检查,而对于不支持泛型的语言而言这是没法作到的。虽然刚开始将泛型引入 C# 的时候确实产生了一些争论,但如今它已经被 C# 和 Java 社区所广泛接受。
泛型提供了一种方式可让咱们推迟类型的定义,一般(但不限于)是参数和返回值的类型。虽然它听起来很复杂,可是实际上经过一个简单的示例咱们就能很是容易地理解它。
//At the moment of creating this function
//I am not defining what T is. The actual
//Type of T will be deferred to the call
//of the doNothing function.
func doNothing (item:T) -> T {
return item
}
//When I call doNothing, I am implicitly
//setting the type of T to the Type of the
//parameter I am sending. In this case,
//an Array.
//Notice how the compiler knows, that the
//return type is an Array.
doNothing([1, 2, 3]).count
虽然上面并非一个真实的例子,可是经过它咱们可以看到在编译时肯定数组内部元素类型的便利。下面是一个更简单的示例,注意编译器是如何知道数组是包含字符串类型的:
var list = ["hello", "world"]
list[0].uppercaseString //HELLO
泛型的使用范围并无被限定于参数,咱们也能够定义泛型类、枚举和结构。事实上,在前面的示例中,list 的类型是 Array<String>。
你可能会将 Swift 中的泛型与 Objective-C 中的协议类比,虽然它们的语法很是类似,可是概念是很是不一样的。Objective-C 并不支持泛型。协议提供了一种方式去声明一个肯定的实现符合某个消息契约,可是契约必须预先指定。例如,使用协议你并不能强迫数组中的全部条目都是同一类型的(不管是什么类型),可是使用泛型可以作到。除了概念上的不一样以外,Swift并不支持协议,就像 Objective-C 不支持泛型同样。
元组是很是简单的概念,你能够定义一个有序的值组。当你须要将多个值做为一个参数来回传递、或者被调用的函数须要返回多个值的时候元组会很是有用。元组并不须要咱们为它的值定义任何类型,编译时会完成全部的类型推理和类型检查工做。定义元组的语法以下:
(1, "Two", ["Three"])
在上面的例子中,咱们建立了一个带有三个值的元组,第一个是一个整数,第二个是字符串,第三个是一个字符串类型的数组。乍一看这很像一个数组,但概念彻底不一样。你不能从一个元组中删除或者向里追加元素,同时注意编译器是如何知道每个值的确切类型的:
你能够经过元素在元组内部的位置引用它的值,正如图片所提示的那样;或者你也能够为每个值指定一个名称。若是一个函数须要返回几个值,那么这是很是方便的,同时它也能让咱们避免定义那些特定于某个函数的类或者结构。下面让咱们看一个这样的例子:
func info(items:[Int]) -> (avg:Int, min:Int, max:Int) {
var sum = items.reduce(0, { $0 + $1 })
var min = items.reduce(Int.max, { $0 > $1 ? $1 : $0})
var max = items.reduce(Int.min, { $0 < $1 ? $1 : $0})
return (sum / items.count, min, max)
}
var result = info([1, 2, 3, 4, 5, 6])
result.avg //3
result.min //1
result.max //6
元组提供了一种很是简单的使用多个值的方法,让咱们省去了定义一个特定的类或者结构的额外工做。
除了上面介绍的特性以外 Swift 还有不少其余的优秀特性值得咱们一看,例如属性观察器、可选连接以及扩展。
我相信Swift具有快速成为一门流行的 iOS 和 OS X 编程语言所须要的全部必须条件,不管是在企业领域仍是在消费者领域。强类型和类型推理特性将会让它很是适合于企业开发,而它的简单性和干净的语法则会吸引那些从事消费者项目的开发人员。