写给初学者的 Swift 教程 Part 1

作者:Thomas Hanning,原文链接,原文日期:2015-10-29
译者:小铁匠Linus;校对:千叶知风;定稿:numbbbbb

Swift 是苹果官方新推出的编程语言,它可以为 iOS、 watchOS、 tvOS 和 Mac OS 开发应用。在本教程中,你将会学到所有的基础操作。

你将在这个“Swift 初学者教程”中学到些什么呢?

本教程包含了以下这些话题:

  • 下载 Xcode
  • Playgrounds
  • Hello World!
  • 变量
  • 常量
  • 类型标注
  • 条件语句
  • 循环语句
  • 可选类型
  • 函数

将会有更多内容出现在“写给初学者的 Swift 教程”系列中。

下载 Xcode

成为 Swift 大牛的第一步当然是下载 Xcode 啦。你可以直接从 App Store 里下载。Xcode 是苹果官方的 IDE 工具,它可以为 iOS、 watchOS、 tvOS 和 Mac OS 这些平台开发应用。

Playgrounds

你会把大部分编程的时间花在具体项目上。但是,Xcode 有一个非常有趣的特性,可以给初学者和大牛带来巨大帮助,它就是 Playgrounds。你可以在 Playground 里写 Swift 代码,写完就直接能看到执行的结果。因此,如果你想要学一些新特性或试验一些新功能,可以打开 Playground 直接编写,不用像在工程里那样先编译再执行。

如果你正在写一个项目,那也可以同时打开一个 Playground,你可以在 Playground 里快速试验一些小功能。

言归正传,讲讲如何使用 Playground。第一步打开 Xcode,接着在欢迎界面点击“Get started with a playground”。如果你没有看到这个欢迎界面,可以按 File -> New -> Playground 这样的路径打开 Playground。指定 Playground 的文件名和保存位置之后,你就可以开始写代码啦。

Hello World!

在大多数的编程书籍中,都把打印“Hello World!”作为第一个项目。我们也不会打破这个传统的,哈哈。

因此,我们在 playground 里写下如下代码:

print("Hello World!")

输完这行代码,你就可以在 playground 的右边看到输出的结果。

写给初学者的 Swift 教程 Part 1_第1张图片

恭喜,你已经成功编写了第一个 Swift 程序!

变量

在打印出第一句代码后,我们可以开始真正的编程啦。你需要从变量开始。变量可以存储一个值,比如数字或字符串。可以使用var关键字来定义变量:

var aNumber = 5

这样,我们就有了一个叫aNumber的变量,它的值为 5。接着,我们可以尝试着改变这个变量的值:

aNumber = 10

我们也可以把一个数学表示式的结果存到这个变量里:

aNumber = 5 + 6

当然也可以把变量的值打印出来,这需要用到特殊的术语,如下:

print("The number is equal \(aNumber)")

变量可以有不同的类型。你可以为变量指定类型,比如字符串、浮点数或者布尔值:

var aString = "A String"
var aDoble = 13.3
var aBool = true

但是,一旦你给变量赋了某一类型的值之后,就只能为变量赋相同类型的值了:

aBool = "A String" //编译错误

编译器是一段可以把你写的代码翻译成机器码的程序。如果你写了一段编译器不能理解或者违反编程规则的代码,编译器就会报错。

常量

顾名思义,变量的值是可以改变的,而常量的值在第一次赋值后就不能修改了。对于常量,你可以使用关键字let来定义:

let aConstantNumber = 10

如果你尝试修改一个常量的值,就会报错:

aConstantNumber = 10 //编译出错

那为什么还要有常量呢?因为,有时候并不希望一个值在第一次赋值后被修改,比如,在指定一个人的姓名后,就不希望这个值被再次修改。

类型标注

我们已经知道,变量在第一次赋值之后会确定类型。当然,我们也可以在赋值时直接指定变量或常量的类型:

let aNumber: Int = 10

这个代码的结果和之前的是一样的,但是现在这段代码更加容易读懂。第一眼就知道这个变量的类型是Int。当然, 除了Int,还有许多其他的类型:

var aString: String = "A String"
var aDouble: Double = 13.3
var aBool: Bool = true

条件语句

一个程序如果总是做相同的事情,这很无聊。因此,出现了所谓的条件语句来控制程序的流向。比如,你想要根据计算的结果有不同的输出。能控制程序流向的,也是最普遍的条件语句是if条件语句,举例如下:

var number1 = 5
var number2 = 10
 
if number1 < number2 {
    print("number1 is smaller than number2")
}

在这段示例代码中,我们通过if条件语句来判断number1是否小于number2。如果满足这个条件的话,程序就会执行到大括号括起来的 if 代码块里。你也可以在代码块里添加你想要执行的代码。

另外,你还可以在if条件判断返回false的代码块里写相应代码:

var number1 = 5
var number2 = 10
 
if number1 < number2 {
    print("number1 is smaller than number2")
} else {
    print("number1 is not smaller than number2")
}

当然,你可以写多个if条件语句:

if number1 < number2 {
    print("number1 is smaller than number2")
} else if number2 < number1 {
    print("number2 is than number2")
} else {
    print("number1 is equal number2")
}

Swift 里另外一种条件语句是switch条件语句。switch语句的形式就是把某个值与一个或若干个值作比较,例子如下:

switch name {
case "Mick":
    print("The name is Mick")
case "John":
    print("The name is John")
default:
    print("The name is neither Mick nor John")
}

switch关键字后写上需要匹配的值name。然后,每个case后跟上可能匹配的值。如果name匹配了某一个值,对应case里的代码将被执行;否则,继续进行匹配。假如没有一个值能够匹配,就会执行default后的代码。对于初学者来说,知道switch条件语句有很多可能匹配的值就足够了。

循环

除了条件语句意外,还有一个控制程序流的重要结构:循环。循环的作用主要是能多次执行代码块里的代码。Swift 有三种循环的类型:while 循环, repeat-while 循环和 for 循环.

while 循环

下面的例子使用了 while 循环:

var i = 0

while (i < 10) {
    print("Hello World")
    i = i + 1
}

while 循环以while关键字开始,在while关键字后跟上判断条件。如果条件为 true,会重复运行代码块里的一系列代码,比如本例子里的循环打印"Hello World"十次。如果没有修改变量i的值,循环将一直进行下去。

repeat-while 循环

repeat-while 循环和 while 循环很相似。但是,不再像 while 循环那样先判断循环条件,例子如下:

var i = 10
 
repeat {
    print("Hello World")
    i = i + 1
} while (i < 10)

为什么要使用repeat-while 循环而不是 while 循环?repeat-while 循环和 while 循环的主要区别是在判断循环条件之前,先执行一次循环的代码块。

var i = 11
 
repeat {
    print("Hello World")
    i = i + 1
} while (i < 10)

上面这个例子中,尽管判断条件永远是 false,但是还是会打印一次“Hello World”。因此,有时候需要先判断,而有时候不想要先判断,这就要根据具体的情况决定到底使用哪种循环。

for 循环

for 循环很好用,它可以对一个集合里面的每个元素执行一系列语句。同时,也有好几种遍历的方式,先来看一个例子:

for i in 1...10 {
    print("This iteration number \(i)")
}

如果像上面的例子一样使用三个点号(闭区间操作符)的话,最后一个数字(10)也会被包含。此外,也可以像下面的例子一样使用:

for i in 1..<10 {
    print("This iteration number \(i)")
}

在上面这个例子中,最后一个数字(10)不会被包含进去。另外,还有一种方式可以写 for 循环,就是标准 C 样式的 for 循环:

for var i = 1; i <= 10; i++ {
    print("This iteration number \(i)")
}

这个循环会执行十次。分号将循环的定义分为 3 个部分:首先,循环首次启动时,变量会被初始化,并赋一个起始值;其次,条件判断表达式被调用,如果表达式调用结果为true,则会执行大括号内部的代码;最后,执行所有语句之后,执行递增表达式,在本例中,变量i每次增加 1。其中,i++等同于i = i + 1

可选类型

可选类型是 Swift 里很特殊的新特性,它非常重要,因此我们在一开始就要介绍它。试想一下,一个变量有可能没有值,比如,一个变量用来存储一个人的 middle name,那某人没有 middle name 的话该怎么表示呢?我们很自然的能想到赋值一个空字符串:

var middleName: String = ""

然而,如果我们让middleName成为可选类型,我们就可以为变量指定表示“这里没有值”的nil。可选类型的定义是在类型后面跟上问号:

var middleName: String? = nil

可选类型的变量可以有非空的值。但是,如果你像普通变量那样访问可选类型的变量,就会编译出错:

var anotherName: String = middleName //编译出错

你可以通过解包来访问,使用感叹号进行解包:

var anotherName: String = middleName!

值得注意的是,如果你对一个非nil的值进行解包,可以得到具体的值;否则,就会在运行时报错,因为不能对nil进行解包。

因此,最好在使用可选类型变量前先判断是否是nil,使用所谓的可选绑定(optional binding)就可以搞定了:

var middleName: String? = "John"
var anotherName: String = "Michael"
 
if let name = middleName {
    anotherName = name
}

一开始,这段代码可能看起来会有点奇怪,实际上很简单,意思也很明确:如果middleName等于nil的话,对应的代码块就不会执行。如果middleName不等于nil的话,变量name就会获得middleName的值,对应的代码块就会被执行。在代码块里,name就不再是可选变量了,因此可以给其他变量赋值。

函数

你可能经常会遇到,一些代码可以应用于许多不同的情况。而函数就是用来完成特定任务的独立的代码块,并且当函数需要执行的时候,这个名字会被用于“调用”函数。先从简单打印“Hello World”的函数开始吧:

func printHelloWorld() {
    print("Hello World!")
}

事实上,你把上面那段代码写到 playground 里,界面右边是没有输出的。如果你通过下面的方式调用这个函数的话,就会有对应的输出了:

func printHelloWorld() {
    print("Hello World!")
}
 
printHelloWorld()

如果你调用这个函数两次的话,你会看到界面右边会出现两次输出:

func printHelloWorld() {
    print("Hello World!")
}
 
printHelloWorld()
printHelloWorld()

你也可以给函数传递额外的信息,即传递参数。每个参数都需要指定参数名和类型,然后你就可以在函数里访问这些参数的值了:

func printANumber(number:Int) {
    print("The number is \(number)")
}

现在,你就可以像下面的方式调用有参数的函数了:

func printANumber(number:Int) {
    print("The number is \(number)")
}
 
printANumber(5)

本例中,对应的输出就是:“The number is 5”。

你甚至可以指定多个参数。然后,你在调用函数时,除了不需要写第一个参数的参数名之外,其他参数都需要写参数名:

func printNumbers(number1:Int, number2:Int, number3:Int) {
    print("The number are \(number1), \(number2), \(number3)")
}
 
printNumbers(5, number2:10, number3:15)

另外,函数最重要的一点就是返回值。如果需要函数有返回值,你就要指定返回值的类型,同时,返回值由return关键字返回。

举个例子:你需要写一个函数,实现返回两个数字中更大者的功能。大体代码如下:

func maxOfNumbers(number1: Int, number2: Int) -> Int {
    if number1 < number2 {
        return number2
    } else {
        return number1
    }
}
 
maxOfNumbers(5, number2: 10)

输出结果为 10。

接下来该干什么

现在已经基本熟悉 Swift 中大部分的基本语法了。这对之后的学习是个很重要的基础。接下来可以自己动手在 Playground 里试着写一些小功能,也可以看看关于本文知识点的其他文章:

  • 该使用 Objective-C 还是 Swift?
  • Swift 中的常量
  • Swift 中的可选类型

在本系列的后续部分,我们会讨论更多关于 Swift 的新特性。请继续关注!

你可能感兴趣的:(写给初学者的 Swift 教程 Part 1)