Swift 教程一: 快速入门

Tags: swift ios

Swift是苹果今年WWDC大会上公布的新编程语言。苹果同时发布了一个很棒的语言的参考指南,强烈建议大家读一读。然而,参考指南实在有些长!所以,如果你时间有限来不及读完参考指南,但又想快速学习Swift,本教程是为你专门准备的。读完这篇Swift教程需要大约15分钟,你可以通过这篇教程快速浏览Swift语言,包括变量、控制流、类、最佳实践以及更多。

你甚至可以在学习的过程中制作一个易用的小费计算器!

在学习本教程时,您安装Xcode的最新版本(我使用的是Xcode 6-Beta)。你不需要有Swift或Objective-C的相关经验,但如果你有一些编程经验的话会对你阅读这篇教程有很大的帮助。

重要提示:请确保您安装了最新的Xcode 6-Beta版(通过在iOS开发者中心核对可以确认)。Swift变化很快,我们正竭尽所针对每个版本更新本教程;教程中的代码可能无法在旧版本的Xcode6-Beta上工作。

注:在写这篇教程的时候,由于Xcode6仍处于beta阶段所以我们不能发布的Xcode6的截图。因此,我们在这篇教程中没有贴出Swift的截图。

一、playground简介

启动Xcode6,打开File\New\File菜单,选择iOS\Source\Playground,然后单击下一步。

将文件命名为SwiftTutorial.playground,单击下一步,然后保存文件合适地方。将文件里的全部代码删除,这样你可以从一个干净的文件开始你的学习过程。

注:创建playground后,你可能会得到一个错误:“Error running playground: Failed to prepare for communication with playground”。如果提示错误,只需要关闭的Xcode并再次重新启动它就可以了。

playground 是一个新的文件类型,它可以一边写代码,一边预览效果,实现“所见即所写”。例如,将下面的代码行添加到你的playground:

let tutorialTeam = 56
let editorialTeam = 23
let totalTeam = tutorialTeam + editorialTeam

当你键入这些代码时,你可以在侧边栏上看到每一行运行的结果。很方便吧。

Playgrounds是了解Swift(你在这篇Swift教程中正在做的)、尝试新的API、通过可视化方式了解绘制代码的好地方。在这篇Swift教程的其余部分,你将主要在playground上工作。

注:在这一点上,我建议你将playground文件(SwiftTutorial.playground)拖动到您的OS X的Dock栏中。
通过这种方式,当你想要编写或测试你的Swift代码时,你可以快速打开playground。

二、Swift中的变量和常量

尝试把下面一行代码添加到playground的底部:

totalTeam += 1

当你加入这一行后,你会得到一个错误。这是因为totalTeam是一个常量,这意味着其值不能被改变。常量使用关键字let申明。

如果你希望tutorialTeam是一个变量“可以改变的值”,你需要用不同的关键字声明它:var

用下面的代码修改totalTeam的定义:

var totalTeam = tutorialTeam + editorialTeam

现在代码正常工作了!你可能想:“变量的限制这么少,为什么不把将所有的东西都声明为变量呢。”。嗯,这是因为因为编译器会优化let申明的常量,而这个是其他申明方式所不具备的。

所以请记住:对于不会被改变的值,最好使用常量!

三、显式指定类型和类型推测

到目前为止,我们还没有明确设置任何常量和变量的类型,因为编译器有足够的信息来自动推测他们的类型。例如,当你申明tutorialTeam为56时,编译器知道56是一个int,所以它会帮你你自动设置tutorialTeam的类型为int。

但是如果你想要显式设定类型也是可以的。用以下代码替换tutorialTeam的申明:

let tutorialTeam: Int = 56

你可能不确定何时需要要显式指定类型或让编译器来推测类型。我们认为最好的方式是尽可能让编译器来推测类型,因为这是Swift主要的优势之一:简洁易读的代码。

因此,将上述代码切换回类型推测:

let tutorialTeam = 56

四、Swift的基本类型和控制流

到目前为止,我们已经看到int类型使用的例子,int类型是Swift这是用于保存整数值,不过Swift还有一堆其他类型,下面将一一介绍。

1. Float和Double

let priceInferred = 19.99
let priceExplicit: Double = 19.99

有两种十进制小数类型:Float和Double。Double具有更高的精度,而且Swift默认推测十进制小数类型为Dobule。这意味着priceInferred也是Double类型。

2. Bool值

let onSaleInferred = true
let onSaleExplicit: Bool = false

请注意,在Swift中您使用true/false作为布尔值(这与Objective-C中使用yes/no的惯例不同)。

3. 字符串

let nameInferred = "Whoopie Cushion"
let nameExplicit: String = "Whoopie Cushion"

你所期望的字符串就是这样定义,但需要注意的是,你不需要像在Objective-C再使用@符号了。

4. if语句和字符串插值

if onSaleInferred {
  println("\(nameInferred) on sale for \(priceInferred)!")
} else {
  println("\(nameInferred) at regular price: \(priceInferred)!")
}

上面是一个if语句的例子,就像你在其他语言中的用法一样。条件周围的括号是可选的,大括号是必须要有的即使if语句只有一行!

上面的例子也展示了新的技术:字符串插值。在Swift中当你想替换字符串中的某些内容时,只需要使用以下语法\(your expression)。

执行完代码后,你可能会想知道到哪里查看这段代码中的println输出。要查看的println输出,打开使用View\Assistant Editor\Show Assistant Editor打开Assistant Editor.

这里是到目前为止本教程所涉及到的源代码:playground file

五、类和方法

在使用Swift进行开发时,你常做的事情就是创建类和定义方法,所以,我们马上就要学习相关知识了!

首先,删除playground文件中的所有内容,这样你就可以有一个干净的开始。:)

接下来,您将创建一个小费计算器类,这个类会帮助你计算餐后该付多少消费。你会花点时间添加一些代码,我们将在这个过程中逐步介绍Swift中的类和方法。

// 1
class TipCalculator {
}

创建一个类非常简单,只需输入class关键字和你要创建类的名称。然后输入两个大括号用来定义类体。

如果你继承另一个类,你需要在类名后增加:和要继承的类的名称。请注意,在Swift中你定义类时不一定需要继承其他类(不像在Objective-C,在那里你必须继承NSObject类或其他或派生自NSObject类的类)。

在花括号内添加以下代码:

  // 2
  let total: Double
  let taxPct: Double
  let subtotal: Double

上面的方法用来在类中创建属性 - 创建变量或常量使用相同的方式。在这里,您将创建三个常量属性 - 一个用于保存消费总额(税后),一个用于保存消费税收比例,一个用于保存消费小计(税前)。

需要注意的是你声明的任何属性必须要有初始值,你可以在声明它们或类初始化赋值 - 否则,你就必须声明属性为可选的(参考后续教程)。

注:根据老美的Emily Post Etipedia,消费应该是睡前^_^消费计算的。这就是为什么这个类应用税前金额来计算小费!

在前一段代码后添加以下代码(花括号内):

// 3
  init(total:Double, taxPct:Double) {
    self.total = total
    self.taxPct = taxPct
    subtotal = total / (taxPct + 1)
  }

上面的代码是类的构造函数它通过两个参数来初始化每个属性。在Swift中构造函数总是名为init - 你可以定义多个构造函数,但是所有这些构造函数需要有不同的参数。

请注意,上面的方法总参数和这个类的属性名称相同。所以,我需要在属性前增加self关键字来区分方法参数和属性。另外,由于subtotal属性没有名称冲突所以不需要添加slef关键字,因为编译器能够自动推测。很酷,是吧?

如果你想知道,这里的subtotal = total / (tipPct + 1)是如何算出来的:

(subtotal * taxPct) + subtotal = total
subtotal * (taxPct + 1) = total
subtotal = total / (taxPct + 1)

感谢@chewbone指出这一点!

在前一段代码后添加以下代码(花括号内):

  // 4
  func calcTipWithTipPct(tipPct:Double) -> Double {
    return subtotal * tipPct
  }

要声明一个方法,你使用FUNC关键字,然后列出函数的参数(你必须明确的指定类型),使用->符号申明返回类型。

上面函数用来计算小费数额,这很简单,只要通过小费的百分比乘以消费小计。

在前一段代码后添加以下代码(花括号内):

// 5
  func printPossibleTips() {
    println("15%: \(calcTipWithTipPct(0.15))")
    println("18%: \(calcTipWithTipPct(0.18))")
    println("20%: \(calcTipWithTipPct(0.20))")
  }

上面的方法会输出三种可能的小费。

需要注意的是,调用类实例的方法时,可以第一个参数可以不用明确指定参数名(但其余的参数还是需要的)。

另外,还要注意字符串插值不仅限于打印输出变量。你可以在右侧内联操做中使用各种复杂的方法!

将下面的代码添加到playground(大括号之后)的底部:

// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.printPossibleTips()

最后,需要创建一个小费计算器的实例,并调用方法打印可能小费。

下面是到这个时候,你第一个playground文件的内容:

// 1
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))")
  }
 
}
 
// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.printPossibleTips()

你可以打开你的Assistant Edito来查看运行结果。

六、数组和for循环

上面的代码中有一些重复代码,是由于你需要以不同小费的比例多次调用calcTipWithTotal方法。可以在这里使用一个数组减少重复。

用以下代码替换printPossibleTips方法:

let possibleTipsInferred = [0.15, 0.18, 0.20]
let possibleTipsExplicit:[Double] = [0.15, 0.18, 0.20]

这段代码显示了同时使用Swift推测和显式类型来创建double数组的一个例子。需要注意的是[Double]是申明Array<Double>快捷方法。

然后,添加下面这些行:

for possibleTip in possibleTipsInferred {
  println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")
}

遍历数组中的元素和Objective-C的快速枚举非常相似 - 注意,可以不用括号!

当然,你也可以自己编写这个循环:

for i in 0..<possibleTipsInferred.count {
  let possibleTip = possibleTipsInferred[i]
  println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")
}

..<运算符不包括数组上界值。另一个运算符...包括数组上界。
数组包含一个count属性用来保存数组中元素个数。您也可以使用arrayName[index]语法在数组中查找一个特定的项目,就像你上面代码里看到方式。

七、字典

让我们对小费计算器做最后一次改变。这次不仅仅简单地打印出的小费,你可以返回包含小费的字典。这将使小费更容易在用户界面中显示。

删除printPossibleTips方法,并将其替换为以下代码:

// 1
func 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
 
}

让我们一段段看下上面的代码:

  • 片段一,首先您定义方法的返回值为一个字典,字典的键类型为int(计算小费的百分比为int,如15或20),字典对应的值类型为Double(计算后小费)。需要注意的是[INT:Double]只是定义字典Dictionary<Int, Double>的快捷方法。

  • 片段二,这是申明一个字典的方法。需要注意的是,因为要修改词典的值所以你需要声明字典为一个变量(用var),而不是一个常量(用let)。否则,你会得到一个编译错误。

  • 片段三,是如何设置字典元素的值。正如你可以看到,它类似于Objective-C中的文本语法。

最后,修改playground的最后一行调用这个方法:

tipCalc.returnPossibleTips()

当playground执行代码后,你可以在inspector(点击eyeball打开扩展视图)查看运行结果了。

就这门多 - 恭喜你,你有一个使用Swift开发的全功能小费计算器了!


版权归属于英文原文:http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start

翻译:www.4byte.cn

本文链接:http://www.4byte.cn/learning/120001/swift-jiao-cheng-yi-kuai-su-ru-men.html