基础部分
声明常量和变量
1 | let maxNumberOfUsers = 10 |
类型标注
1 | var welcomeMessage: String |
输出常量和变量
1 | let name = "Jim" |
类型转换
需要显式转换数据类型
1 | let num1: Uint8 = 1 |
元组
元组可作为方法的返回值,一次返回多个数据。或者普通的传参使用。
1 | // 元组的创建 |
可选类型(optionals)
使用可选类型来处理值可能缺失的情况。
1 | let possibleNumber = "123" |
nil
1 | // 可以给可选变量赋值为nil来表示它没有值 |
if 语句以及强制解析
用来判断一个可选值是否包含值
当确定可选类型确实包含值之后,就可以在可选的名字后面加一个感叹号(!)来获取值。这叫做可选值的强制解析**(forced unwrapping)
1 | if convertedNumber != nil { |
可选绑定(optional binding)
可选绑定可以用在 if 和 while 语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量。
1 | if let actualNumber = Int(possibleNumber) { |
隐式解析可选类型
有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型_总会_有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。
这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。把想要用作可选的类型的后面的问号(String?)改成感叹号(String!)来声明一个隐式解析可选类型。
隐式解析可选类型主要被用在 Swift 中类的构造过程中。
1 | let possibleString: String? = "An optional string." |
空合运算符(Nil Coalescing Operator)
空合运算符(a ?? b)将对可选类型 a 进行空判断,如果 a 包含一个值就进行解封,否则就返回一个默认值 b。表达式 a 必须是 Optional 类型。默认值 b 的类型必须要和 a 存储值的类型保持一致。
1 | let defaultColorName = "red" |
区间运算符(Range Operators)
1 | // 闭区间运算符 |
集合类型 (Collection Types)
数组(Arrays)
一个数组只能存放同一类型的数据
创建一个空数组
1 | var someInts = [Int]() |
创建一个带有默认值的数组
1 | var threeDoubles = Array(repeating: 0.0, count: 3) |
用数组字面量构造数组
1 | var shoppingList: [String] = ["Eggs", "Milk"] |
控制流(Control Flow)
Switch
区间匹配
1 | let approximateCount = 62 |
我们可以使用元组在同一个switch语句中测试多个值。元组中的元素可以是值,也可以是区间。另外,使用下划线(_)来匹配所有可能的值。
下面的例子展示了如何使用一个(Int, Int)类型的元组来分类下图中的点(x, y):
1 | let somePoint = (1, 1) |
值绑定(Value Bindings)
case 分支允许将匹配的值绑定到一个临时的常量或变量,并且在case分支体内使用 —— 这种行为被称为值绑定(value binding),因为匹配的值在case分支体内,与临时的常量或变量绑定。
下面的例子展示了如何在一个(Int, Int)类型的元组中使用值绑定来分类下图中的点(x, y):
1 | let anotherPoint = (2, 0) |
Where
case 分支的模式可以使用where语句来判断额外的条件。
下面的例子把下图中的点(x, y)进行了分类:
1 | let yetAnotherPoint = (1, -1) |
复合匹配
当多个条件可以使用同一种方法来处理时,可以将这几种可能放在同一个case后面,并且用逗号隔开。当case后面的任意一种模式匹配的时候,这条分支就会被匹配。并且,如果匹配列表过长,还可以分行书写:
1 | let someCharacter: Character = "e" |