Swift教程第一部分:快速指南

发布于:2014-07-10 11:11阅读数:

Swift是苹果今年在WWDC发布的一门新语言。我极力推荐苹果同时发布一封非常好的Swift指导手册。这份教程可以让你粗略的了解一下Swift这门语言,包括变量,流程控制,类以及最佳实践等等。

本文转自泰然网

 
Swift是苹果今年在WWDC发布的一门新语言。
 
在此,我极力推荐苹果同时发布一封非常好的Swift指导手册
 
尽管,这份手册有点长!所以如果你没有时间,而且只是想尽快的了解Swift,那么本篇教程很适合你。
 
这份教程大约需要15分钟,让你粗略的了解一下Swift这门语言,包括变量,流程控制,类以及最佳实践等等。
 
你甚至可以最终完成一个简单的小费计算器。
 
完成这份Swift教程,你需要最新版本的Xcode(Xcode 6-Beta 版本,在这边稿件定稿的时候)。你不需要任何Swift或者Objectiv-C的经验,但是如果你以前有一些编程的而经验将会很有帮助。
 
注意:在撰写这篇指南以前,我们的理解是我们不能张贴Xcode相关的截图,因为它还处于Beta阶段。因此,我们在确保不会引起相关问题之前,将不会提供截屏。
 
有关Playgrounds的介绍

启动Xcode6,然后进入File\New\File。选择iOS\Source\Playground,然后点击下一步。
 
命名这个文件SwiftTutorial.playground,点击下一步,然后保存这个文件在一个合适的地方。从文件里删除所有东西,保证你从一个初始状态开始。
 
注意:创建playground之后,你可能得到一个错误提示告诉你"运行Playground失败:不能开始和Playground的通信。",如果这样子,只需要关闭Xcode,然后重启,这个错误就会消失。
 
Playground是一种能够让你测试Swift代码的文件类型,你能够从边栏上看到每一行代码的运行结果。例如,把下面的代码加到你的Playground:
  1. let tutorialTeam = 56 
  2. let editorialTeam = 23 
  3. let totalTeam = tutorialTeam + editorialTeam 
随着你输入这些行,你会在边上看到每一行的运行结果。很方便,对不对?
 
Playgrounds是了解Swfit的一种很好的方式(就像你在这份Swift的快速手册中所做的一样),去体验新的API,构建尝试代码和算法,或者去图形化你的绘图代码。在接下来的Swift教程中,你会一直使用这个Playground。
 
注意:在这个阶段,我同样推荐,你把你的playground文件(SwiftTurorial.playground)拖到你的OS X Dock上。
 
这样,你就可以在任何你想要尝试一些Swift代码的时候,随时把这个文件当做一个快速的实验场地。
 
Swift中的变量和常量

尝试把下面这行加到你playground的最后一行:
  1. totalTeam +=1 
添加完后,你会注意到一个错误。这是因为totalTeam是一个常量,这意味着他的值永远不能被改变。你可以通过let关键词来声明一个常量。
 
因此你会希望tutorialTeam作为一个变量—一个可以被改变的值—因此你需要用另外一个关键词var来声明它。
 
用下面的内容替换掉初始化totalTeam的那一行:
  1. var totalTeam = tutorialTeam + editorialTeam 
现在可以了!你可能会想,“为什么不声明所有的值为变量?这样就比较不那么严格了。”
 
嗯,最佳实践是在所有适用的地方,都用let去声明,因为这样就可以让编译器更好的去做一些优化。所以记住:尽可能适用let。
 
显式与隐式类型

目前为止,因为编译器有足够的信息来推测出数据的类型,你可能还没有显式的设置任何常量或者变量的类型。
 
例如,由于你把tutorialTeam值设置为56,编译器知道56是一个Int型,所以它会把tutorialTeam自动的设置为Int型。
 
当然,如果你需要,你也可以显式的定义它的数据类型。试试把定义tutorialTeam的那行换成下面这样:
  1. let tutorialTeam: Int = 56 
你可能想知道,什么时候你应该显式的指定数据类型,什么时候应该让编译器自动指定数据类型。我们相信应该尽可能的让编译器去自动推测数据的类型,因为这样,你才可能体会到Swift的主要特性和优势:简洁和易读的代码。
 
因此,我们把这行重新改回隐式类型:
  1. let tutorialTeam = 56 
 
Swift中的基本数据类型和流控制

到目前为止,你已经看了一个Int类型的例子,在Swift中,这是用来存储整型的值,但是还有很多其他类型。
 
浮点数和双精度浮点数
  1. let priceInferred = 19.99 
  2. let priceExplicit: Double = 19.99 
有两种类型用来存储小数:浮点数和双精度浮点数。双精度浮点数有更高的精度,它被默认作为隐式声明的小数值。这意味着变量priceInferred也是一个双精度浮点数。
 
布尔值
  1. let onSaleInferred = true 
  2. let onSaleExplicit: Bool = false 
注意,在Swift中,你使用true/false来代表布尔值(不想Objective-C中使用YES/NO的规定)。
 
字符串
  1. let nameInferred = "Whoopie Cushion" 
  2. let nameExplicit: String = "Whoopie Cushion" 
字符串没什么特别,除了你要注意到你不需要像在Objectiv-C中那样使用@符号。你可能需要一段时间来适应。 :]
 
if语句和字符串生成
  1. if onSaleInferred { 
  2.   println("\(nameInferred) on sale for \    (priceInferred)!"
  3. else { 
  4.   println("\(nameInferred) at regular price: \(priceInferred)!"
这是一个if语句的例子,就像其他大部分语言一样。条件两边的括号是可选的,但是大括号对于即使只有一句的语句也是必须的—-很难接受么?
 
这里同样展示了一种叫做字符串构成的新方法。在Swift中,当你需要在字符串中替换某些内容时,只要使用这种格式:(你的表达式)。
 
在这里,你可能想知道println输出的内容去了什么地方。为了看到println的输出,通过View\Assistant Editor\Show Assistant Editor来显示Assistant Editor。
 
这里是目前为止这份教程中涉及到的playground文件
 
类和方法

一个你在Swift开发过程中最常做的,就是创建类以及他的方法,所以我们现在就开始吧。
 
首先,在playground文件中删除所有其他的东西来开始。
 
接下来,你会创建一个小费计算器的类,用来帮助来计算出你在餐厅应该给多少小费。你每次只需要写一点代码,并且每一步都会有详细的说明。
  1. // 1 
  2. class TipCalculator { 
要创建一个类,只需要输入class关键词以及你的类的名称。然后你需要用两个大括号把类的内容包起来。
 
如果你要继承一个其他的类,你需要加上一个:和你需要继承的类的名字。注意你不一定非要继承自任何一个子类(不想Objetive-C,你必须作为NSObject或者任何其他继承自NSObject的子类)。
 
把以下代码加入到大括号中去:
  1. // 2 
  2. let total: Double 
  3. let taxPct: Double 
  4. let subtotal: Double 
这就是你在类中创建属性的方法—就像创建变量或者常量一样。 这里你创建了3个常量属性—-一个用来存储账单的总额(税后),一个用来保存税率,还有一个用来统计总额(税前)。
 
注意到你声明的任何属性时必须被赋予一个初始值,要么在声明的时候,要么在你的intializer里—否则你只能声明它为可选的(关于这一点,以后会讲到更多)。
 
注意: 按照Emily Post Etipedia, 小费应该是按照税前计算。因此这个类在加上小费之前计算税前金额。
 
把下面这些代码放到第一个程序块之后(在大括号内):
  1. // 3 
  2. init(total:Double, taxPct:Double) { 
  3.   self.total = total 
  4.   self.taxPct = taxPct 
  5.   subtotal = total / (taxPct + 1) 
这里为这个类构建了一个包含两个参数的initializer。在Swift中,initializers一直被命名为init—你可以有多个,如果需要的话,但是必须拥有不同参数。
 
注意这里,我给这个方法的参数名和属性名定义了同样的名字。因此,我需要通过使用self前缀来区分出两者的不同。
 
注意到,由于subtotal属性没有命名冲突,你不需要在前面加上self关键词,因为编译器可以自动识别到这一点。很Cool,是不是?
 
注意:为了避免你的好奇,这里详细解释一下 subtotal = total/(tipPct+1)的计算是怎么来的:
  1. (subtotal * taxPct) + subtotal = total 
  2. subtotal * (taxPct + 1) = total 
  3. subtotal = total / (taxPct + 1) 
在这里感谢一些@chewbone,指出这一点。
 
接着上一段代码,加入以下代码(在大括号内):
  1. // 4 
  2. func calcTipWithTipPct(tipPct:Double) ->      Double { 
  3.   return subtotal * tipPct 
  4.  } 
使用func来声明一个方法。然后,你需要列出用到的参数(你必须显式的说明参数的类型),加入 -> 符号,然后加入返回值的类型。
 
这是一个用来确定最终小费的函数。其实就是一个简单的乘法,使用总额乘以小费的比例。
 
接着加入下面的代码(在大括号内):
  1. // 5 
  2. func printPossibleTips() { 
  3.   println("15%: \(calcTipWithTipPct(0.15))"
  4.   println("18%: \(calcTipWithTipPct(0.18))"
  5.   println("20%: \(calcTipWithTipPct(0.20))"
这里是一个新方法,打印出了三种可能的小费。
 
注意当你调用一个类的实例的方法时,第一个参数不需要被命名(剩余的则需要)。
 
同时,注意到字符串组成不只局限于输出变量。只要你想,你可以直接包含各种复杂的方法调用和操作。
 
最后在playground的尾部加入下面这些代码(在大括号后面):
  1. // 6 
  2. let tipCalc = TipCalculator(total: 33.25,     taxPct: 0.06) 
  3. tipCalc.printPossibleTips() 
最终,你构建了一个小费计算器的实例,然后调用了它的方法打印出可能给出的小费金额。
 
下面列出了你当前playground文件应该的样子:
  1. // 1 
  2. class TipCalculator { 
  3.  
  4. // 2 
  5.     let total: Double 
  6.     let taxPct: Double 
  7.     let subtotal: Double 
  8.  
  9. // 3 
  10.    init(total:Double, taxPct:Double) { 
  11.      self.total = total 
  12.      self.taxPct = taxPct 
  13.      subtotal = total / (taxPct + 1) 
  14.    } 
  15.  
  16. // 4 
  17.   func calcTipWithTipPct(tipPct:Double) ->      Double { 
  18.      return subtotal * tipPct 
  19.    } 
  20.  
  21. // 5 
  22.   func printPossibleTips() { 
  23.     println("15%: \(calcTipWithTipPct(0.15))"
  24.     println("18%: \(calcTipWithTipPct(0.18))"
  25.     println("20%: \(calcTipWithTipPct(0.20))"
  26.   } 
  27.  
  28.  
  29. // 6 
  30.  let tipCalc = TipCalculator(total: 33.25,      taxPct: 0.06) 
  31. tipCalc.printPossibleTips() 
你可以通过检查Assistant Editor来确认一下结果。
 
数组和For循环

当前,上面的代码存在一些重复,因为你调用calcTipWithTotal了很多次,以计算不同的小费比例。你可以在这里通过使用数组来降低重复。
 
使用以下内容替换掉printPossibleTips:
  1. let possibleTipsInferred = [0.15, 0.18, 0.20] 
  2. let possibleTipsExplicit:Double[] = [0.15, 0.18, 0.20] 
这里示范了一个数组的例子,既有显示声明类型的,页游隐式声明类型的。
 
然后在下面加上以下代码:
  1. for possibleTip in possibleTipsInferred { 
  2.   println("\(possibleTip*100)%: \   (calcTipWithTipPct(possibleTip))"
枚举数组内的值和在Objective-C中快速列举一样—注意到这里不需要使用括号!
 
你同样可以这样写这个循环:
  1. for i in 0..possibleTipsInferred.count { 
  2.   let possibleTip = possibleTipsInferred[i] 
  3.   println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))"
这里使用的..操作符是一个不包括上边界的的范围操作符,因此并不包括上部的边界值。同时有一个包括上边界…操作符。
 
数组有一个count属性,用来保存数组内的成员个数。同样你也可以通过arrayName[index]的格式来访问数组成员的内容。
 
词典

我们来对小费计算器做最后一点改进。不用只是打印出小费数字,你可以返回一个包含结果的词典。这会使得在应用界面中可以很方便的显示这一类数据结果。
 
删除printPossibleTips方法,然后用以下的内容替换:
  1. // 1 
  2. func returnPossibleTips() -> Dictionary<Int, Double>    { 
  3.  
  4. let possibleTipsInferred = [0.15, 0.18, 0.20] 
  5. let possibleTipsExplicit:Double[] = [0.15, 0.18, 0.20] 
  6.  
  7. // 2 
  8. var retval = Dictionary<Int, Double>() 
  9. for possibleTip in possibleTipsInferred { 
  10.     let intPct = Int(possibleTip*100) 
  11. // 3 
  12.     retval[intPct] = calcTipWithTipPct(possibleTip) 
  13. return retval 
  14.  
最后让我们按段落过一下:
 
1. 你确定了方法的返回类型为一个以Int型(作为小费的比率,例如15或者20)为关键词,然后以双精度为值的词典类型(计算出的小费金额)。
 
2. 这里说明了如何构建一个新的空词典。注意到,由于这里修改了词典,你需要定义它为一个变量(使用var)而不是一个常量(使用let)。否则,你会得到一个编译错误。
 
3. 这里可以看到如何对词典内的值进行赋值。就像你看到的,这个和Objective-C的方式很像。
 
最终,修改playground里的最后一行来调用这个方法。
 
  1. tipCalc.returnPossibleTips() 
 
一旦playground开始运行,你应该可以在Inspector中看到词典类型的结果(点击眼球图标可以展开查看详情)。
 
就这些—恭喜你!你已经有一个Swift代码构建的小费计算器。
 
接下来还有什么?

这里是完整的playground文件包括所有教程中提到的Swift代码。
 
想学习更多?继续阅读这一系列的剩余部分,你可以学会如何为这个app构建用户界面,或者看一看我们的新Swift书
 
希望你可以享受这个教程,欢迎来到Swift的世界!:]

CocoaChina是全球最大的苹果开发中文社区,官方微信每日定时推送各种精彩的研发教程资源和工具,介绍app推广营销经验,最新企业招聘和外包信息,以及Cocos2d引擎、Cocos Studio开发工具包的最新动态及培训信息。关注微信可以第一时间了解最新产品和服务动态,微信在手,天下我有!

请搜索微信号“CocoaChina”关注我们!

搜索CocoaChina微信公众号:CocoaChina

顶部