简易Swift教程(一)

来源:互联网 发布:网站源码分析工具 编辑:程序博客网 时间:2024/04/29 19:10

本教程翻译自http://www.raywenderlich.com  原文链接——转载请注明。

Swift语言发布有一段时间了,因目前的项目都不使用Swift所以也没有去系统的学习,翻译本教程的目的是加深自己的理解,同时希望能帮到更多有意学习Swift的童鞋。

注:本教程使用的IDE是Xcode 6。本教程只是Swift入门教程,了解更详细更权威信息,请阅读Apple的Swift reference guide 

A Quick Start

1.使用Playgrounds

启动Xcode6,打开File\New\File.选择iOS\Source\Playground,点击Next。给文件命名,点击Next,保存文件在任何你喜欢的地方。
playground 是一种允许你测试Swift代码并且可以看到每一行代码的运行结果的新型文件。

把下面几行代码加到playgound文件中:
<span style="font-size:14px;">let tutorialTeam = 56let editorialTeam = 23let totalTeam = tutorialTeam + editorialTeam</span>
输入这几行之后,你可以看到每一行的结果,很方便吧。
playground是学习Swift的很好的方法,可以在上面验证代码和算法,或者让你绘图代码在playground中直接绘出图片。

2.Swift中的变量和常量

把下面这行代码加到你的playground文件中:

<span style="font-size:14px;">totalTeam += 1</span>

加上这行playground会报错,这是因为totalTeam是一个常量,这意味着它的值永远不能改变。常量使用关键词let声明。

如果你想让totalTeam的值可以改变,使用关键词var声明它为变量。

<span style="font-size:14px;">let tutorialTeam = 56</span>


把初始化totalTeam的代码替换成下面这行:

<span style="font-size:14px;">var totalTeam = tutorialTeam + editorialTeam</span>
现在不报错了,你可能会想“为什么不全都用var来声明,这样会有更少的限制?”。事实上,你应该尽可能的使用let声明,这样才能让编译器优化。所以记住:尽量用let声明。

3.显示和推断类型(Explicit vs. Inferred Typing)

目前为止你还没有显示的为这些变量和常量设置任何类型,因为编译器有足够的信息去自动推断它的类型。

例如,因为你设置tutorialTeam为56,编译器知道56是int类型,所以它自动为你把tutorialTeam设置为int。

然而,你也可以显示的设置类型,把设置tutorialTeam的那行代码替换成下面这行:

<span style="font-size:14px;">let tutorialTeam: Int = 56</span>
你可能会疑惑什么时候显示设置类型,什么时候让编译器为你推断类型。我们认为应该尽可能的让编译器自动推断,因为这样你就会得到Swift语言的一个主要的优势,简洁和容易的去读代码。

因此把这一行改成推断类型:

<span style="font-size:14px;">let tutorialTeam = 56</span>


4.Swift中的基本类型和控制流

Floats和Doubles

<span style="font-size:14px;">let priceInferred = 19.99let priceExplicit: Double = 19.99</span>
有两个类型来表示小数的值,Float和Double.Double拥有更高的精度,也是推断小数的默认类型。这意味着priceInferred也是Double类型的。


Bools

<span style="font-size:14px;">let onSaleInferred = truelet onSaleExplicit: Bool = false</span>
需要注意的是,在Swift中使用true/false来为boolean类型的变量赋值(不像在OC中习惯使用的YES/NO).


Strings

<span style="font-size:14px;">let nameInferred = "Whoopie Cushion"let nameExplicit: String = "Whoopie Cushion"</span>
String类型正如你所期待的,不再使用@作为前缀了,这可能得让习惯了OC的你们适应一会。


If和字符串插入(string interpolation

<span style="font-size:14px;">if onSaleInferred {  println("\(nameInferred) on sale for \(priceInferred)!")} else {  println("\(nameInferred) at regular price: \(priceInferred)!")}</span>
条件判断语句的括号是可选的,但是花括号是必须的,即使只有一行代码。

上面这段代码也展示了一种名为字符插入的新技术,在任何你想代替字符串的地方使用语法:\(your expression)。


5.类和方法

在Swift项目中你最常做的事情就是创建类和方法,所以我们直奔主题。

首先,删除playgorund中之前写的代码。

接下来,你将要创造一个小费计算器来帮你计算在餐厅里应该付多少小费。你将会每次添加一小块代码,每一步我都会详细的解释。

<span style="font-size:14px;">class TipCalculator {}</span>
创建类的时候只需要使用class关键字和你的类名,然后使用花括号包住类体。

如果你的类继承自另一个类,在你的类名之后加上冒号然后键入需要继承的类名。注意:你的类可以不继承自任何类(在Objective-C中,必须继承自NSObject或者其他类)。

在花括号内加入:

<span style="font-size:14px;"> let total: Double let taxPct: Double let subtotal: Double</span>
上面的代码在类中创建了属性(properties)方法和创建常量与变量一样。这里你创建了三个常量属性。注意:声明的任何属性在声明的时候必须设置初始值,或者在初始化器中设置。否则必须声明为可选的(optional)。

把下面这段代码加入花括号内最底部:

<span style="font-size:14px;">init(total:Double, taxPct:Double) {    self.total = total    self.taxPct = taxPct    subtotal = total / (taxPct + 1)  }</span>
这段代码为这个类创建了带有两个参数的初始化器,在Swift中初始化器总是命名为init,你可以创建多个,但是必须带有不同的参数。

需要注意的是我初始化器参数的命名和类的属性名一样,为了区分两者我需要在属性名之前加上self前缀。

还需要注意的是没有和subtotal这个属性冲突的参数名,不需要加self关键词,因为编译器会自动推断。


在上段代码之后加入:

<span style="font-size:14px;">func printPossibleTips() {    println("15%: \(calcTipWithTipPct(0.15))")    println("18%: \(calcTipWithTipPct(0.18))")    println("20%: \(calcTipWithTipPct(0.20))")  }</span>
这是可以打印三种可能小费的新方法。

注意:调用方法的构造器时,第一个参数不必命名(其他参数必须命名)。

注意字符串插入是如何打印出变量的,在字符串插入中你可以调用任何复杂的函数。


在花括号之后加入:

<span style="font-size:14px;">let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)tipCalc.printPossibleTips()</span>
终于,你创建了这个小费计算器类的实例,并且调用了打印小费的方法。

现在,你的playground应该是这样的:

<span style="font-size:14px;">class TipCalculator {   // 2  let total: Double  let taxPct: Double  let subtotal: Double   // 3  init(total:Double, taxPct:Double) {    self.total = total    self.taxPct = taxPct    subtotal = total / (taxPct + 1)  }   // 4  func calcTipWithTipPct(tipPct:Double) -> Double {    return subtotal * tipPct  }   // 5  func printPossibleTips() {    println("15%: \(calcTipWithTipPct(0.15))")    println("18%: \(calcTipWithTipPct(0.18))")    println("20%: \(calcTipWithTipPct(0.20))")  } } // 6let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)tipCalc.printPossibleTips()</span>
看看右边输出的结果是不是正确。


6.数组(Array)和for循环(For Loops)

上面的代码中有些是重复的,因为你使用不同的小费百分比调用了几次calcTipWithTotal方法。可以使用Array来精简重复的代码。

把printPossileTips方法内的代码用下面的代码替换:

<span style="font-size:14px;">let possibleTipsInferred = [0.15, 0.18, 0.20]let possibleTipsExplicit:[Double] = [0.15, 0.18, 0.20]for possibleTip in possibleTipsInferred {  println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")}</span>
上面两行代码非别用推断类型和显式类型创建了Double类型的数组,[Double]是Array<Double>的简写。

遍历数组中的元素很像Objective-C中得快速遍历,但是不需要括号。

这个For循环也可以这样写:

<span style="font-size:14px;">for i in 0..<possibleTipsInferred.count {  let possibleTip = possibleTipsInferred[i]  println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")}</span>
操作符 ..< 是non-inclusive范围运算符,不包含上边界。而操作符 ... 包含上边界。
Array有一个count属性表示元素个数。可以使用arrayName[index]语法获取数组中特定位置的元素。


7.字典类型(Dictionaries)

让我们最后一次修改我们的小费计算器,相比简单的打印出小费,你可以返回一个带有结果的字典。在开发应用时这种格式的数据更易被展示在界面上。

删除printPossibleTips方法,用下面的替换:

<span style="font-size:14px;">// 1func returnPossibleTips() -> [Int: Double] {   let possibleTipsInferred = [0.15, 0.18, 0.20]  let possibleTipsExplicit:[Double] = [0.15, 0.18, 0.20]   // 2  var retval = Dictionary<Int, Double>()  for possibleTip in possibleTipsInferred {    let intPct = Int(possibleTip*100)    // 3    retval[intPct] = calcTipWithTipPct(possibleTip)  }  return retval }</span>
我们一步一步分析这段代码:

1.这个方法返回一个字典,字典的key是一个Int型值,value是一个Double型值。[Int: Double]是Dictionary<Int,Double>的简写。

2.这里你创建了一个空的字典,因为你需要更改这个 字典的值,所以你必须把这个字典声明为变量而不能是常量,否则编译器会报错。

3.为字典设置值(set an item in a dictionary)和Objective-C很像。

最后,修改最后一行:

tipCalc.returnPossibleTips()
当playground计算之后,你可以看到这个字典的值。

恭喜你,现在你已经使用Swift创建了一个全功能的消费计算器!


何去何从?

这里是本教程的最终版playground file.

想学习更多Swift知识?请继续阅读本系列的下一节。

希望你喜欢本教程,也欢迎进入Swift世界!:]


本人才疏学浅,Swift也仅仅是入门,错误在所难免,望轻拍!——译者注










0 0
原创粉丝点击