2.1 可空类型
- 可空类型能够安全地检查某个值是否为空,当值不为空时,才会被访问。
- 在运行时,可空类型有两种不同的表示方式:Some或者None。
- 在类型说明后面添加“?”修饰符(如Int?)。不限于类,任何类型都可以修饰为可空类型。
- 可空类型对值进行了装箱处理,如果要访问可空类型的值,必须进行拆箱,即在变量名后添加一个“!”。但是,如果对一个不存在的值进行拆箱,应用程序将崩溃。
- 在Swift中,非可空类型不允许为空。如果对非可空类型赋空值将导致编译错误。
- Swift提供了一种将检查和拆箱操作合并到一个步骤的语法,即所谓的可空绑定。
2.2 泛型
- 泛型能够减少重复的代码,能充分利用Swift强大的类型系统编写善于表达和抽象的函数及对象。
- 泛型的形式: func 函数名< T : ...>
其中,T起到占位符的作用,当函数被调用时T被具体的类型所替换。
2.3 类型声明和类型推断
- Swift编译器的类型系统和类型推断允许在保证最简性的同时创建出安全的代码。
2.4 函数和闭包
闭包提供了一种创建自包含代码片段的函数式的方法,同时还能从上下文中自动捕获值。闭包有三种不同的形式:全局函数、嵌套函数、闭包表达式。
2.4.1 全局函数
一个全局函数带有函数名,但不捕获任何值。
其形式:
func 函数名(参数列表) -> 返回值类型{}
2.4.2 嵌套函数
- 嵌套函数无法从声明此函数上下文的外部调用,但嵌套函数可以被它们的容器函数以返回值的形式暴露给外部。
- 与全局函数不捕获任何值不同,嵌套函数能捕获容器函数中的值。
- 嵌套函数自动捕获其容器函数中的所有变量和常量。
2.4.3 闭包表达式
闭包表达式提供了一种轻量级的隔离代码的方法(不需要对代码块进行命名),同时从上下文中捕获值。
其形式:
{ (参数列表) -> 返回值类型 in
Swift语句
}
2.5 元组
- 元组中存储的值可以非常灵活,每个值都可以有单独的类型和长度。
- 要访问元组的成员,可以通过索引或者将元组分解到多个变量中。
- 在创建元组时,可以为每个成员进行命名,以便通过名称来访问元组成员。
- 将函数的返回值声明为元组,这样函数就可以一次返回多个值。同样可以为返回值中的元组成员指定名称。
- 如果元组中的某个值不需要,在分解时可以用下划线“_”替代。
2.6 switch语句和模式匹配
- Swift中的switch语句可以利用模式匹配提供更加灵活的代码。
- 为了减少不必要的错误,case语句不再提供自动贯穿的功能,而且所有可能的值都必须在case语句中列出。
- 虽然不使用break语句,后续分支仍然不会被执行;如果需要代码贯穿到下一分支,必须显式地使用fallthrough关键字。
- case语句可以匹配值、范围、模式并进行值绑定。