第一章:基本数据类型

196 阅读4分钟

1.1 常量和变量

常量使用关键字let来声明,变量使用关键字var来声明。

在定义常量或者变量的时候,可以加上类型声明,告诉编译器常量或变量中要存储的值的类型,类型声明的格式为:

let constantName : type
var variableName : type

编译器可以在第一次为常量或变量赋值的时候推断出其类型。

1.2 整型和浮点型

最常用的是整型Int,它的位长取决于运行程序的平台的原生字长。在64位的平台上运行,那么程序中的Int实际就是Int64;而在32位的平台上,Int实际就是Int32

1.3 布尔型

Swfit中布尔类型用关键字Bool来表是,它有两个值,分别用关键字truefalse

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")
}