1.1 基本语法
1.1.1 变量和常量
- var关键字:声明一个变量
- let关键字:声明一个常量
这样的声明规则适用于Swift中的所有数据类型,有别于Objective-C,在Objective-C中,是由类型本身决定是否是可变还是不可变。在Swift中,一个对象的可变版本与不可变版本具有相同的类型——并不是子类(subclass)的关系。
- Swift是一门强类型语言(每一个变量的类型在编译时期就已经确定了,并且在整个生命周期里只能存储固定类型的值)。
这样的规则有助于Swift成为一门具有安全性的编程语言:编译器会阻止混合类型之间进行操作,并可以引发异常结果。
- 在使用变量之前,必须给变量设置一个初始值。
- Swift有一个功能叫类型推断(type inference)。如果编译器能够从初始值中获取到足够多的信息,进而推断出初始值的类型,那么在声明变量时可以忽略掉具体的类型。
在选择是否指明类型时,要考虑两件事:
- 代码的可读性
- 当类型可以通过编译器推断时,开发者可能依然希望明确地指定某种类型,来为代码增加额外的安全检查。
1.1.2 字符串插值
- 可以利用字符串的插值操作,将变量、常量和其他表达式的值添加到输出中。
- 字符串插值操作不仅仅可以适用于输出,在使用字符串的任何地方都可以使用字符串插值。
1.2.3 流程控制
*** 条件语句 ***
if语句
与Objective-C有些不同之处:
- Swift中减少了不必要的语法结构:if语句并非必须将检测表达式放入括号中。
- 条件语句的代码块必须在大括号中。
- 检测表达式的结果必须明确地为true或false
switch语句
switch语句基于Objective-C,不过在Swift中,它更加强大,有两个重要的区别:
- 在switch中必须覆盖每一种可能出现的情况(default分支就是用来满足这一需求的)。
- case分支语句处理方式的重大改变,当遇到下一个case分支开始时,当前的case语句就会自动结束,无须添加break语句。
*** 循环语句 ***
for语句
for语句的检测表达式可以忽略括号
for-in语句
可以迭代集合中的每一项。有两种新的区间运算符可以用于for-in循环语句中的迭代区间。
- “..<”是半开区间运算符,它包含区间最左端的值,但是不包含最右端的值。
- “...”是闭区间运算符,它包括区间两端的值。
while语句
只要检测条件为true,就会一直进行迭代。如果一开始,检测条件就为false,循环语句不会迭代任何内容,并且忽略掉整个while语句。
do-while语句
在循环的尾部计算检测条件,这样,就可以保证循环语句至少被迭代一次,即使当检测条件为false,也会迭代最后一次(可能发生在第一次迭代)。
注意:
- 使用循环语句时,当需要调整迭代次数时,可以通过完全退出迭代(使用break关键字)或忽略单次迭代(使用continue关键字)的方法进行调整。使用break可以立即跳出当前循环,并取消之后的迭代。使用continue可以终止当前迭代,并立即开启下一次迭代。
- 在嵌套循环中,break和continue只会影响内部循环。Swift有一个强大的功能:给循环语句添加一个标签(label,名称自己命名),然后在内部循环中指定希望break或continue到哪个循环中。一个标签由名称之后跟着一个冒号构成,并且标签位于循环语句关键字之前。
1.2 基本数据类型
1.2.1 整型
存储整形值的基本类型是Int。
当需要特定长度的整形时,有Int8、Int16、Int32和Int64。
Int类型同样有无符号的版本,如UInt8等。
注意:
- 由于Swift是一门强类型语言,代码中不能随意混合搭配使用Int的各种类型,并且不能在混合类型之间做数学运算和比较操作。
1.2.2 Double和Float
当使用小数时,编译器总是将其推断为Double类型,而不是Float。因此,如果不需要64位的高精度,需要显式地将变量声明为Float。
1.2.3 布尔型
Swift使用true和false表示布尔值。在Swift中只有表达式显式地返回一个布尔类型才能被用于布尔值的声明。
1.2.4 字符串
在Swift中,字符串只需要简单地置于双引号内即可。使用“+”或“+=”可以对字符串进行拼接、追加。但是,不能直接将Character与String进行拼接,需要将Character包含于新的String来进行拼接。
另外,Swift可以通过“==”对String直接进行比较。
1.2.5 数组
数组是集合类型中的一种,用来存储相同类型的有序列表。在Swift中,声明数组时,必须指定数组包含的类型。
与OC不同,在Swift中,可以把结构体、枚举和类添加到数组中,这是因为如果将枚举或结构体添加到数组中,此时添加的是对象的一份副本,而不是原始对象的引用;如果添加的是类,那么会将对象的引用添加至数组中。同样的规则适用于数组的传递,因为数组是结构体,所以数组传递的时候是一份副本,而数组中的元素是副本还是引用,取决于该元素是结构体、枚举还是类。
1.2.6 字典
字典是存储无序相同类型的集合,存储在其中的每一个对象都有唯一的一个Key。