1.1 常量和变量
常量使用关键字let来声明,变量使用关键字var来声明。
在定义常量或者变量的时候,可以加上类型声明,告诉编译器常量或变量中要存储的值的类型,类型声明的格式为:
let constantName : type
var variableName : type
编译器可以在第一次为常量或变量赋值的时候推断出其类型。
1.2 整型和浮点型
最常用的是整型Int,它的位长取决于运行程序的平台的原生字长。在64位的平台上运行,那么程序中的Int实际就是Int64;而在32位的平台上,Int实际就是Int32。
1.3 布尔型
Swfit中布尔类型用关键字Bool来表是,它有两个值,分别用关键字true和false。
1.4 元祖型
元祖型就是由多个类型组成的一个复合类型,其中每一个类型都可以是任意类型,并不是要求相同的类型。例如,可以创建一个类型(Int, String)的元祖,也可以创建一个(Int, String, Bool)的元祖。
读取元祖中的值,有3中方法。
- 第一种,将元祖赋值给另一个元祖。如果只想取元祖中部分的值,还可以用下划线来忽略不需要的部分,如:
(_, Description)。 - 第二种,通过下标来访问元祖中的特定元素,下标从0开始自左向右递增以表示不同的元素。
- 第三种,在定义元祖的时候给每一个元素命名。在读取元祖的时候,就可以通过这些元素的名字来获取元素的值。
let http404Error = (404, "Not Found")
// 第一种
let (Code, Description) = http404Error
print(Code, Description)
// 第二种
print(http404Error.0, http404Error.1)
// 第三种
let http406Error = (Code: 406, Description: "Not Acceptable")
print(http406Error.Code, http406Error.Description)
元祖可以作为函数的参数和返回值来使用,大大增加了返回信息的可读性。但是元祖不适合复杂的数据结构,特别是长期使用的数据结构,这种情况下应该使用结构体或类来描述。
1.5 可选型
可选型就是用来表示一个变量或常量可能有值也可能没有值的情况。声明一个可选类型的格式:
let constantName: Type?
var variableName: Type?
可选类型在没有赋值之前,系统会默认分配一个nil值。
对于可选类型,一般有2中用法。第一种就是 if 语句加强强制解析,即if (num != nil)来判断可选型是否有值。对于有值的可选型,可以使用 "!" 来进行强制解析,从而获得可选型的值。
第二种用法就是在 if 或 while 的条件判断语句中,把可选型赋值给一个临时变量(常量)。
var num : Int?
if let number = num {
print(number)
} else {
print("没有值")
}
隐式解析可选型是一种可以被当作非可选类型使用的,使用的时候不需要强制解析来获取值,只需要声明的时候在类型后面加上 "!" 。
隐式解析类型可以没有初始值,但是中途一定会赋值,使用的时候一定有值。
如果一个变量的值在使用的过程中可能为nil,应该将其声明为可选类型,而不是隐式解析可选型。
1.6 异常处理
Swift 提供了一种异常处理机制来解决异常,分为两个部分:抛出异常和捕获异常。
当一个函数执行中遇到某种错误,需要抛出一个异常,然后由函数的调用者来处理这个异常。关键字:throws,格式如下:
func canThrowError() throws {
statements
}
调用一个可能会抛出异常的函数,需要对异常进行捕获和处理。这里在调用函数的语句前面加上关键字try,然后在通过catch语句针对不同类型的错误进行相应的处理。格式如下:
do {
try canThrowError()
} catch Error.type1 {
action1()
} catch Error.type2 {
action2()
}
例如:
enum NameError: Error {
case EmptyName
}
func canThrowError(name: String) throws {
if name.isEmpty {
throw NameError.EmptyName
}
print("name = \(name)")
}
do {
try canThrowError(name: "")
} catch NameError.EmptyName {
print("name is Empty")
}