如果你还不知道Swift的话,你应该回头复习一下苹果的WWDC 2014发布会了。WWDC 2014上苹果出人意料地宣布了一种从Objective-C进化而来的全新语言——Swift,这在我所知的苹果发布会历史上,还是头一遭介绍这么一个外人摸不着头脑的东西。好在是WWDC,台下坐着的基本都是开发者,从基调演讲的现场反应来看,大家对Swift的反响是出乎意料的强。另一方面,从今年WWDC的会议日程来看,除去几乎每天都有“动手做环节“——Swift Lab之外,光是含Swift字样的讲座就不下8个。有面向小白的“Introduction to Swift”,面向中级者的“Intermediate Swift”,还有上级者向的“Advanced Swift Debugging in LLDB”、“Swift Interoperability In Depth”等。这不,已经有公司发出招聘启事:招聘Swift开发人员,要求Swift编程经验不少于1天。一时间似乎全世界都在讨论Swift。
苹果还火上浇油,在《The Swift Programming Language》里开门见山地宣称[1]
Swift融合了最佳的现代编程语言思想和最强力的苹果工程学文化。Swift语言在优化开发流程的同时,却没有在性能上进行任何妥协。
现在面对我们的问题是:投资时间研究它究竟有没有价值,还是纯粹浪费时间?如果你读到现在还没有果断右上角,我想答案已经很明确了。现在就让我们来近距离观察一下这只轻巧灵活的雨燕吧!
简洁的语法糖
基本类型和容器
先来看看普通类型和容器好了。字符串处理的好坏,决定了一个现代语言的第一印象。在这里我们看到Swift做的似乎还不错,列表容器的定义和使用也和诸多现代语言接近,在这一点上让开发者对Swift平添了不少好感。
// let关键字做常量定义 let famouseDeveloper = "Hideo Kojima" // var关键字创建变量,下面是一个列表容器 var bigHandPublishers = ["EA", "Activision", "Tencent"] bigHandPublishers[2] = "UBI Soft" //有点丢人还是换了吧 for publisher in bigHandPublishers { // 字符串格式化 println("\(famouseDeveloper) once worked at \(publisher).") } // 认真你就输了 // Hideo Kojima once worked at EA // Hideo Kojima once worked at Activision // Hideo Kojima once worked at UBI Soft
函数和闭包
现代语言大抵会把函数和闭包作为第一公民处理,即享受基本类型的同等待遇,有些情况下待遇甚至更高。Swift也不例外。在闭包的使用上,由于抛弃了Objective-C里繁琐的语法,不再是block那种张牙舞爪的样子,变成了下面的小清新状:
// 函数定义 func foobar() { println("Hello World") } // 带返回值定义的函数 func httpResponse() -> (Int, String) { return (200, "Succeeded") // 支持多重返回值 } /* * 带闭包参数的函数 * 注意task参数声明为一个不带任何参数和返回值的闭包 */ func repeat(count: Int, task: () -> ()) { for i in 0..count // 注意这里的range,是[0, count) { task() } } // 如何调用看下面 repeat(2) { println("Hello World!") } // 打印结果: // Hello World! // Hello World!
严肃对待类型
Swift是一门类型安全的语言,它支持duck typing,但还是严肃地对待类型,编译期间会做类型检查。这对于使用动态语言的粗心程序员来说无疑是一种福利。于是像这样,Swift可以声明变量的类型:
var i:Int = 30
也可以声明optional类型,也就是在类型后面加问号:
var optionalInteger: Int?
// 嗯,很多独立游戏 var groundBreakingGames = [ "2D Boys": "World of Goo", "notch" : "Minecraft", "Simogo": "Year Walk", "Coconut Island Games": "iDragPaper" ] // 字典定义 // 我觉得Simogo的Device 6更具代表性 groundBreakingGames["Simogo"] = "Device 6" // 修改字典 // 自己的游戏好像还没出呢:optional string let myGame: String? = groundBreakingGames["Beacon Labs"] // 这是普通青年的写法 if myGame { // 感叹号操作符被称为forced unwrapping let myRealGame = myGame! println("Hey check out this awesome game: \(myRealGame)") } // 这是文艺青年的写法,不需要显式的unwrapping if let myRealGame = myGame { println("Hey check out this awesome game: \(myRealGame)") }
Optional Chaining
Optional value看似稍有点麻烦,但带来了更多的安全性,相信也是苹果在设计这门语言中做出的取舍。Optional的概念还带来了所谓的optional chaining,用更少的判断来鼓励更少的错误。以发布会的例子来说
//这是原Objective-C的写法 if (myDelegate != nil) { if ([myDelegate respondsToSelector: @selector(scrollViewDidScroll:)]) { [myDelegate scrollViewDidScroll:myScrollView]; } } // 这是Swift的写法 myDelegate?.scrollViewDidScroll?(myScrollView)
对上面的例子可以这么理解:当optional value为nil的时候,运行时(runtime)不进行unwrap,并且直接跳过后续表达式的计算。是不是碉堡了?
可能你会说Swift像某某语言。没错,一千个人眼里有一千个哈姆雷特,Python程序员觉得Swift像Python,Ruby程序员觉得像Ruby,还有人觉得Swift像是拿Go改的一版Objective-C。这正是苹果棋高一着的地方,在让你感受新语言的简洁高效之外,还不让你觉得它太陌生,顺便还能向你的朋友们炫耀一下你的博学多才。
据说,现在github上Swift语言的开源项目已多达300多个了,而我们却没有太多时间关心这当下最火的语言。给我们一点时间,下次来聊一聊对Swift的一些更深刻的认识与不满,这样也对得起标题里的“不”字。主题不仅仅限于:Objective-C的包袱、苹果的封闭平台、继承和扩展、对象生命周期管理。
灵活的语法规则和高效的代码,Swift可以多多关注,上篇意犹未尽,期待下篇更新
Wow! Great to find a post with such a clear megsase!
Ah, I tested again. I didn’t know that it is possible to select several languages in this field and all entries remain. Normally such select fields accept one selected entry only. Yes, it works.But please add Lower Sorbian to the language list.Thank you.