原文:Swift Tutorial Part 1: Expressions, Variables and Constants
欢迎来到我们的迷你系列之开始使用 Swift 编程!
在这个系列中,你将学习一些编程的基础知识,同时在一个现代的、友好的开发环境中使用 Swift 编程语言。
我们不会用大量的理论来烦扰你,你将通过使用 Swift Playgrounds 立即开始编写代码,这是一种类似沙盒的环境,你可以直接运行代码,而不需要编写整个应用程序。
在本教程中,你需要 Xcode 10,即 macOS 的标准开发环境。如果你的 Xcode 版本为 9 或更低,本教程中的一些代码也许不能如期运行。
开始
你用来编写软件的工具集通常被称为工具链。在工具链中,你编写代码的部分被称为集成开发环境(IDE)。Xcode 是你的 IDE,它包括 playgrounds。
在这个系列中,你将使用 playgrounds 来练习编程,所以了解它们的工作原理很重要。这就是你将在本教程的其余部分学习的内容。
创建一个 Playground
当你打开 Xcode 时,它将以下面的欢迎界面迎接你:
如果你没有看到这个屏幕,很可能是因为 Show this window when Xcode launches( Xcode 启动时显示这个窗口 ) 的选项没有被选中。你也可以通过按 Command-Shift-1 来打开这个屏幕。你也可以从菜单栏中点击 Window ▸ Welcome to Xcode。
在欢迎屏幕上,你可以通过点击 Get started with a playground 来快速打开一个 playground。现在点击它,Xcode 将为你提供一个模板的选择界面。
你选择的平台只是定义了 Xcode 将使用哪个版本的模板来创建 playground。目前,你可以选择的是 iOS、macOS 或 tvOS。每个平台都有自己的环境设置,并准备好让你开始在里面玩代码。就本教程而言,选择你希望的任何平台。你不会写任何特定平台的代码;相反,你将学习 Swift 语言的核心原理。
选择 Blank 空白模板并点击下一步。Xcode 现在会要求您为 playground 命名并选择一个位置来保存它。这个名字只是表面上的,供你自己使用;当你创建你的 playground 时,请随意选择能帮助你记住它们是什么的名字。
点击 Create 来创建和保存 playground。然后 Xcode 会向你展示这个 playground,像这样。
新的 playgrounds 开始时并不完全是空白的,而是有一些基本的启动代码来让你开始。不要担心--你很快就会了解这些代码的含义。
Playgrounds 预览
乍一看,playground 可能看起来像一个相当花哨的文本编辑器。那么,这里有一些消息给你。它本质上就是这样的!
上面的截图强调了以下首要和最重要的事情:
- 源码编辑器。这是你编写 Swift 代码的区域。它很像一个文本编辑器,如记事本或TextEdit。你会注意到,它使用了所谓的单色字体,这意味着所有的字符都是一样的宽度。这使得代码更容易阅读和格式化。
- 结果侧边栏:这个区域显示了你执行代码时的结果。在你阅读本系列文章时,你会了解到更多关于代码如何执行的信息。结果侧边栏是你确认你的代码是否按预期工作的主要地方。
- 执行控制。playground 默认是自动执行的,这意味着你可以编写代码并立即看到输出。这个控件允许你再次执行操场。按住 ▶︎(执行)按钮可以在自动执行和手动执行模式之间切换。
- 活动查看器。它显示 playground 的状态。在上面的截图中,它显示 playground 已完成执行,并准备好在源码编辑器中处理更多代码。当 playground 正在执行时,查看器将用一个旋转器表示。
- 面板控制。这些切换开关显示和隐藏三个面板,一个出现在左边,一个在底部,一个在右边。这些面板分别显示你可能需要时常访问的额外信息。你通常会把它们隐藏起来,就像截图中那样。当你完成这个系列时,你会了解到更多关于这些面板的信息。
Playgrounds 从上到下执行源码编辑器中的代码。每次你改变代码,Playgrounds 都会重新执行所有内容。你也可以通过点击菜单栏中的 Editor ▸ Run Playground 来强制重新执行。另外,你也可以使用执行控制。
你可以通过点击菜单栏中的 Xcode ▸ Preferences... ▸ Text Editing ▸ Line Numbers 在源码编辑器左侧显示行数。当你想引用你的代码的一部分时,行号是非常有用的。
一旦 playground 执行完毕,Xcode 就会更新结果侧栏,以显示源编辑器中相应行的结果。当你完成本系列的例子时,你会看到如何解释你的代码的结果。
代码注释、算术运算、常量和变量是任何语言的一些基本构建模块,Swift 也不例外。
代码注释
Swift 编译器从你的源代码中生成可执行代码。为了实现这一目标,它使用了一套详细的规则。有时,这些细节会掩盖你为什么以某种方式写代码的蓝图,或者你想要解决的问题。为了防止这种情况,最好把你写的东西记录下来,以便下一个接手的人能够理解你的工作。毕竟,下一个人,可能就是未来的你。:]
Swift,像其他大多数编程语言一样,允许你通过使用所谓的注释来记录你的代码。这些注释允许你在代码旁边直接写任何文字,而编译器会忽略这些文字。
写注释的第一种方法是这样的:
swift
// This is a comment. It is not executed.
这是一个单行注释。你可以像这样把这些堆起来,让你写段落:
swift
// This is also a comment.
// Over multiple lines.
然而,有一种更好的方法来编写跨越多行的注释。像这样:
swift
/* This is also a comment.
Over many...
many...
many lines. */
这是一个多行注释 。开始部分用/*
表示,结束部分用*/
表示。非常简单!
你应该在必要时使用代码注释来记录你的代码,解释你的意图,或者仅仅是为你的同事留下笑柄。:]
打印输出
查看代码所执行的结果也很有用。在 Swift 中,你可以通过使用 print
命令来实现这一点。
print
会将你想要的东西输出到调试区,有时也被称为控制台。
例如,考虑下面的代码:
swift
print("Hello, Swift Apprentice reader!")
这将向调试区输出一条漂亮的信息,像这样:
你可以使用上图中红色显示的向下箭头的方框按钮来隐藏或显示调试区。你也可以点击菜单栏中的 View ▸ Debug Area ▸ Show Debug Area 来做同样的事情。
算术运算
当你取一个或多个数据并将它们变成另一个数据时,这被称为运算。
理解运算的最简单方法是思考算术。加法运算需要两个数字,并将它们转化为两个数字的总和。减法运算需要两个数字,并将它们转换为两个数字的差。
你会发现你的应用程序中到处都是简单的算术。从统计一个帖子的"喜欢"数量到计算一个按钮或一个窗口的正确大小和位置,数字的确无处不在。
在本节中,你将学习 Swift 提供的各种算术运算,考虑它们如何适用于数字。稍后,你会看到数字以外的其他类型的运算。
简单运算
Swift 中的所有操作都使用一个被称为操作符的符号来表示它们执行的操作类型。
考虑一下你在早期上学时学到的四种算术运算:加法、减法、乘法和除法。对于这些简单的操作,Swift 使用以下运算符:
- 加法:
+
- 减法:
-
- 乘法:
*
- 除法:
/
这些运算符是这样使用的:
swift
2 + 6
10 - 2
2 * 4
24 / 3
这些行中的每一行都是所谓的 "表达式"。一个表达式有一个值。在这些情况下,所有四个表达式都有相同的值:8。你写代码来执行这些算术运算,就像你用纸笔写代码一样。
在你的 playground 中,你可以在右边的栏里看到这些表达式的值,被称为结果侧边栏,像这样:
如果你愿意,你也可以删除运算符周围的空白:
swift
2+6
移除空白是一件全有或全无的事情:你不能混合使用各种风格。比如说:
swift
2+6 // OK
2 + 6 // OK
2 +6 // ERROR
2+ 6 // ERROR
如果你在运算符的两边留有空白,通常更容易阅读表达式。
十进制数字
上面的所有操作都使用了整数,更正式地称为 integers。然而,正如你所知,并不是每个数字都是整数。
作为一个例子,考虑以下情况:
swift
22 / 7
你可能会惊讶地发现,这样做的结果是数字 3。这是因为,如果你在表达式中只使用整数,Swift 会把结果变成一个整数。在这种情况下,结果被四舍五入为下一个整数。
你可以通过把它改成下面的方式告诉 Swift 使用十进制数字:
swift
22.0 / 7.0
这一次,结果是 3.142857142857143,符合预期。
取余操作
到目前为止,你所看到的四种操作是很容易理解的,因为你在生活中的大部分时间都在做这些操作。Swift 还有更复杂的操作,你可以使用,所有这些都是标准的数学操作------只是不太常见。你现在就来复习一下。
其中第一个是余数运 算,也叫模数运算。在除法中,分母进入分子的整数倍,加上一个余数。这个余数正是余数运算的结果。例如,10模3等于1,因为3进入10三次,余数为1。
在 Swift 中,余数运算符是 %
符号,你可以这样使用它:
swift
28 % 10
在这种情况下,结果等于8,因为10进入28两次,余数为8。如果你想用十进制数字计算同样的事情,你可以这样做:
swift
(28.0).truncatingRemainder(dividingBy: 10.0)
这个计算方法是用28除以10,然后截断结果,砍掉任何多余的小数,并返回余下的部分。当没有小数时,其结果与%相同。
移位操作
左移和右移操作将一个十进制数的二进制形式,分别向左或向右移位。然后它们返回新的二进制数的十进制形式。
例如,二进制数字14,填充到8位,是00001110。向左移两位的结果是00111000,也就是十进制的56。
下面是这个移位操作过程中发生的一个插图:
填补右边空位的数字变成了0,左边落下的数字则丢失。
向右移位也是如此,但数字会向右移动。
这两种操作的运算符如下:
- 左移:
<<
- 右移:
>>
这些是你看到的第一个包含一个以上字符的运算符。事实上,运算符可以包含任何数量的字符。
下面是一个使用这两种运算符的例子:
swift
1 << 3
32 >> 2
这两个值都等于数字8。
使用移位的一个原因是为了使2的幂的乘法或除法变得简单。请注意,左移1等于乘以2,左移2等于乘以4,以此类推。同样地,右移1与除以2相同,右移2与除以4相同,等等。
在过去,代码经常使用这种技巧,因为对 CPU 来说,移位比复杂的乘法和除法运算要简单得多。因此,如果使用移位,代码会更快。然而,如今,CPU 的速度要快得多,编译器甚至可以将乘法和除以2的幂的运算转换为移位。因此,你只会看到移位用于二进制运算,除非你成为一名嵌入式系统程序员,否则你可能不会看到移位运算符。
运算优先级
有很多时候,有必要使用多个运算符来计算一个数值。下面是一个如何在 Swift 中这样做的例子:
swift
((8000 / (5 * 10)) - 32) >> (29 % 5)
注意括号的使用,在 Swift 中,括号有两个作用:让阅读代码的人--包括你自己--清楚你的意思,以及消除歧义。例如,请看下面的例子:
swift
350 / 5 + 2
这等于 72(350除以5,加2)还是 50(350除以7)?你们中那些在学校有注意的人将会大叫 "72!" 你会是对的!
Swift 使用同样的推理,并通过所谓的运算符优先级来实现这一点。除法运算符(/)的优先级高于加法运算符(+),所以,在这个例子中,代码首先执行除法运算。
如果你想让 Swift 先做加法运算------也就是返回 50------那么你可以像这样使用括号:
swift
350 / (5 + 2)
优先级规则与你在学校数学课上学到的一样。乘法和除法有相同的优先级,高于加法和减法,后者也有相同的优先级。
数学函数
Swift 也有大量的数学函数供你在必要时使用。你永远不知道什么时候需要拿出一些三角函数,特别是当你是一个专业的 Swifter 和需要编写那些复杂的游戏时。
注意:并非所有这些功能都是 Swift 的一部分。有些是由操作系统(OS)提供的。不要删除作为 playground 模板一部分的
import
语句,否则 Xcode 会告诉你它找不到这些函数。
例如,考虑以下情况:
swift
sin(45 * Double.pi / 180)
// 0.7071067811865475
cos(135 * Double.pi / 180)
// -0.7071067811865475
它们分别计算正弦和余弦。请注意,这两种方法都使用了 Double.pi
,这是一个常数,Swift 为你提供了现成的 π,并以计算机可能达到的精度计算。很好!
然后是这个:
swift
(2.0).squareRoot() // Same as sqrt(2)
// 1.414213562373095
你知道sin(45°)等于2的平方根吗?
另一个常见的操作是寻找两个变量的最大值。你可以像这样使用它们:
swift
max(5, 10)
// 10
min(-5, -10)
// -10
这些函数分别计算两个数字的最大值和最小值。
如果你特别喜欢冒险,你甚至可以这样组合这些函数:
swift
max(sqrt(2), Double.pi / 2)
// 1.570796326794897
命名数据
在最简单的情况下,计算机编程都是关于操作数据的。记住,你在屏幕上看到的一切都可以简化为你发送给 CPU 的数字。有时,你自己以各种类型的数字来表示和处理这些数据;其他时候,数据以更复杂的形式出现,如文本、图像和集合。
在你的 Swift 代码中,你可以给每一块数据起一个名字,以便你以后引用它。这个名字带有一个相关的类型,表示这个名字所指的是哪种数据,比如文本、数字或日期。
接下来你会了解一些基本类型,在本系列的其余部分你还会遇到许多其他类型。
常量
看看这个:
swift
let number: Int = 10
这里声明了一个名为 number
的常量,它的类型是 Int
。然后,它将该常量的值设置为数字 10。
注:回想一下运算符,这里还有一个等号
=
,被称为赋值运算符。
Int
类型可以存储整数。存储小数的方式是这样的:
swift
let pi: Double = 3.14159
这与 Int
常量类似,只是名称和类型不同。这一次,常数是 Double
类型,一种可以存储高精度小数的类型。
还有一种叫 Float
的类型,是浮点的简称,它存储小数的精度比 Double
低。事实上,Double
的精度大约是 Float
的两倍,这就是为什么它首先被称为 Double
。Float
占用的内存比 Double
少,但一般来说,数字的内存使用不是一个大问题,你会看到 Double
在大多数地方使用。
一旦你声明了一个常量,你就不能改变它的数据。例如,考虑下面的代码:
swift
let number: Int = 10
number = 0
这段代码产生了一个错误:
swift
Cannot assign to value: 'number' is a 'let' constant
在 Xcode 中,你会看到错误是这样的:
常量对于那些不会改变的数值是很有用的。例如,如果你在为一架飞机建模,需要跟踪可用座位的总数,你可以使用一个常数。
你甚至可以用一个常数来表示像一个人的年龄的东西。尽管他们的年龄会随着每个生日而变化,但你可能只关心他们在这个特定时刻的年龄。
变量
通常,你想改变一个名字背后的数据。例如,如果你要记录你的银行账户的存款和提款余额,你可能会使用一个变量而不是一个常量。
如果你的程序的数据从来没有改变过,那么这将是一个相当枯燥的程序!但是,正如你所看到的,你可以使用一个变量,而不是一个常量。但是,正如你所看到的,不可能改变一个常量背后的数据。
当你知道你需要改变一些数据时,你应该用一个变量来表示这些数据,而不是用一个常量。你以类似的方式声明一个变量,像这样:
swift
var variableNumber: Int = 42
只有语句的第一部分是不同的:你用 let
声明常量,用 var
声明变量。
一旦你声明了一个变量,你就可以自由地把它改成任何你想要的东西,只要类型保持不变。例如,要改变上面声明的变量,你可以这样做:
swift
variableNumber = 0
variableNumber = 1_000_000
要改变一个变量,你只需给它分配一个新的值。
注意:在 Swift 中,你可以选择使用下划线来使较大的数字更容易被人阅读。下划线的数量和位置由你决定。
这是个好时机,可以仔细看看 playground 的结果侧栏。当你把上面的代码输入 playground 时,你会看到右边的结果侧栏在每一行都显示 variableNumber
的当前值:
结果侧栏将显示每一行的相关结果(如果存在)。在变量或常量的情况下,结果将是新的值,无论你是刚刚声明了一个常量,还是声明或重新赋值了一个变量。
使用有意义的名字
总是尝试为你的变量和常量选择有意义的名字。好的名字,就像好的注释,可以使你的代码更容易阅读。
一个好的名字可以具体描述该变量或常量所代表的内容。下面是一些好名字的例子。
personAge
NumberOfPeople
GradePointAverage
通常情况下,一个不好的名字只是没有足够的描述性。下面是一些坏名字的例子:
a
temp
average
关键是要确保当你以后再读到这个变量或常量时,你能明白它指的是什么。不要错误地认为你有无懈可击的记忆力!在计算机编程中,回顾自己的代码是很常见的。在计算机编程中,早在一两天后回过头来看自己的代码时,就已经忘记了它的作用,这种情况很常见。给你的变量和常量起一个直观、准确的名字,让你自己更容易理解。
另外,注意上面的名字是怎么写的。在 Swift 中,常见的是驼峰法的命名方式,下面会解释。对于变量和常量,请遵循这些规则来正确处理名字的大小写:
- 以小写字母开始。
- 如果名字是由多个词组成的,就把它们连在一起,并以大写字母开始每个后续的词。
- 如果这些词中有一个是缩写,就把整个缩写的大小写在一起(例如,sourceURL和urlDescription)。
在 Swift 中,你甚至可以使用全部的 Unicode 字符。例如,你可以这样声明一个变量:
swift
var 🐶💩: Int = -1
这可能会让你发笑,但对于像这样的特殊字符要谨慎使用。它们更难输入,因此,最终可能会给你带来更多的痛苦而不是乐趣。
像这样的特殊字符在你存储的数据中可能更有意义,而不是在 Swift 代码中。
递增与递减
你需要的一个常见操作是能够增加或减少一个变量。在 Swift 中,这是这样实现的:
swift
var counter: Int = 0
counter += 1
// counter = 1
counter -= 1
// counter = 0
计数器变量开始时为0,增量将其值设为1,然后减量将其值设回0。
这些运算符与赋值运算符(=)类似,只是它们也进行加减运算。它们获取变量的当前值,加上或减去给定的值,然后将结果分配给变量。
换句话说,上面的代码是以下内容的速记:
swift
var counter: Int = 0
counter = counter + 1
// counter = 1
counter = counter - 1
// counter = 0
同样,*=
和 /=
运算符分别对乘法和除法做等价处理:
swift
var counter: Int = 10
counter *= 3 // Same as counter = counter * 3
// counter = 30
counter /= 2 // Same as counter = counter / 2
// counter = 15
何去何从?
你可以使用本教程顶部或底部的下载材料按钮下载最终的 playground。为了提高你的 Swift 技能,你会发现一些小练习要完成。如果你被卡住了,或者你需要一些帮助,可以随时利用配套的解决方案。
在本教程中,你只处理了数字--包括整数和小数。当然,代码的世界里还有更多的东西! 在本系列的下一部分中,你将学习更多的类型,如字符串,它允许你存储文本。
本系列教程的下一部分涉及类型和操作;继续阅读第二部分:类型和操作,继续你的 Swift 冒险之旅。
如果有任何问题或意见,请在下面的讨论中告诉我们!
本教程摘自《Swift Apprentice》第四版第1章和第2章,可在 raywenderlich.com 商店购买。
请看一下,并让我们知道你的想法!