首页 > 代码库 > Welcome to Swift (苹果官方Swift文档初译与注解十一)---70~76页(第二章)

Welcome to Swift (苹果官方Swift文档初译与注解十一)---70~76页(第二章)

Type Aliases (类型别名)

  类型别名是个已经存在的类型定义另一个名字.定义类型别名的时候,使用关键字typealias.

  当你想要使用名字来引用一个已经存在的类型时,类型别名将非常有效,并且更适合代码的上下文理解.例如,当要处理指定大小的一个数据时:

    typealias AudioSample = UInt16

  一旦定义了一个类型别名,就可以在任何地方来代替原来的类型名:

    var maxAmplitudeFound = AudioSample.min

    // maxAmplitudeFound is now 0

  上面的代码里, AudioSample被定义为UInt16的别名,因为它是一个别名,所以调用AudioSample.min实际上是调用UInt16.min,它最后给变量 maxAmplitudeFound赋值了一个初始  化的0.

Booleans (布尔类型)

  Swift有一个基本的布尔类型:Bool,布尔类型的值用来进行逻辑判断.因为Bool值只能是 true或者false.在Swift中,系统提供了两个布尔类型的常量:true 和 false:

    let orangesAreOrange = true

    let turnipsAreDelicious = false

  代码中,通过使用布尔类型值来初始化,因此常量orangesAreOrange 和 turnipsAreDelicious 的类型是Bool.与使用Int和Double一样,上面的代码里在给常量赋值true或false后,就不  需要再声明它们是布尔类型了.在Swift中,类型判断帮助代码具有更精确和可读性,当给常量或者变量初始化一个已知类型的值的时候,常量或变量的类型就是这个值的类型.

  在进行条件判断的时候,布尔类型的值特别有用,例如下面代码中的if语句:

    if turnipsAreDelicious {

        println("Mmm, tasty turnips!")

    } else {

        println("Eww, turnips are horrible.")

    }

    // prints "Eww, turnips are horrible.”

  if条件判断语句会在流程控制中讲到.

  Swift中,类型安全机制禁止给非布尔类型的值赋值布尔类型.下面的代码将会报告一个编译器错误:

    let i = 1

    if i {

        // this example will not compile, and will report an error

    }

  但是,下面这样的代码是正确的:

    let i = 1

    if i == 1 {

        // this example will compile successfully

    }

  因为 i == 1 比较的结果是布尔类型,因此可以通过类型安全检查.

  与Swift的其他类型安全一样,布尔类型检测避免了偶尔的错误和潜在的代码问题.

Tuples (元组)

  元组是将多个值组合起来,形成一个复合的值.在元组内部的值,可以是任意类型,也可以互不相同.

  在下面的例子中,(404, "Not Found")就是一个描述HTTP的状态编码的元组.HTTP状态编码是当你进行web访问时,从web服务器返回的特定的值. 404, "Not Found"这个状态码表  示访问的网页不存在.

    let http404Error = (404, "Not Found")

    // http404Error is of type (Int, String), and equals (404, "Not Found")

  元组(404, "Not Found") 将一个Int类型 和一个 String类型组合在一起后赋值给HTTP状态编码:一个数值和一个可读性的描述,它也可以这样描述:一个(Int,String)类型的元组.

  创建元组时,可以任意排列类型,可以包含任意不同的类型.例如可以定义一个(Int,Int,Int)类型的元组,也可以定义一个(String,Bool)类型的元组,或者其他任意你需要的类型.

  解析元组,可以像下面代码中的方式,独立访问元组中的常量或者变量:

    let (statusCode, statusMessage) = http404Error

    println("The status code is \(statusCode)")

    // prints "The status code is 404"

    println("The status message is \(statusMessage)")

    // prints "The status message is Not Found”

  如果仅仅需要处理元组的某些值,忽略的部分使用(_)来处理.

    let (justTheStatusCode, _) = http404Error

    println("The status code is \(justTheStatusCode)")

    // prints "The status code is 404

  访问元组的独立元素值,也可以使用索引.元组的索引是以0开始:

    println("The status code is \(http404Error.0)")

    // prints "The status code is 404"

    println("The status message is \(http404Error.1)")

    // prints "The status message is Not Found”

  在元组定义的时候,可以对每个元素进行命名:

    let http200Status = (statusCode: 200, description: "OK")

  如果给元素进行了命名,可以通过这个元素的名字来访问它们的值:

    println("The status code is \(http200Status.statusCode)")

    // prints "The status code is 200"

    println("The status message is \(http200Status.description)")

    // prints "The status message is OK”

  在接收函数的返回值时,元组是非常有用的.一个返回网页的函数可能需要返回(Int,String)类型的元组来描述网页获取成功或者失败.通过返回两个不同的值,每个值的类型也不同的元  组,函数可以提供更多的输出信息,这样要比它只能返回单一类型的一个单一值更有效.

  注意点:

  临时将相互关联的值组合起来,元组是非常有效的.但不适合用来创建复杂的数据类型.如果你要保存一个超出局部范围的全局的数据,使用类或者结构体要更加适合.