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

Optionals (可选类型)

  当一个值可能有值,也可能没有值,这种情况你可以使用可选类型.可选类型的意思是:

  有个一个值,它等于x,或者,根本没有任何值.

  注意点:

  可选类型的概念在C和OC中都是没有的.在OC中最相似的情况是,一个方法返回nil或者返回一个对象.OC中返回nil意思是没有合法的对象.然而,这只能针对对象,不能用在结构体,基本  数据类型,或者枚举值.对于这些类型,OC的方法只能返回固定的某个值(比如NSNotFound)来提示没有某个值.这要去方法的调用者清楚的记得返回的固定值来进行测试和检查.在Swift  中,可选类型可以用于任何类型的值,不再需要固定的常量.

  例如,在Swift中String类型有一个叫做toInt的方法,它将一个String值转换成Int值,然而不是每个String类型值都可以转换成Int值.String类型的”123”可以被转换成Int类型的123,但  是String类型的”hello,world”却不能转成任何Int类型的值.

  下面的代码使用toInt方法试图将一个Sting类型转换为Int:

    let possibleNumber = "123"

    let convertedNumber = possibleNumber.toInt()

    // convertedNumber is inferred to be of type "Int?", or "optional Int”

  由于toInt方法可能失败,它返回一个可选类型Int而不是整型Int.可选类型Int写法是Int?,而不是Int.问号?表示它是可选类型值,这意味着,它可能有某些Int类型的值,或者它根本没有任何  值(它也不能包含其他别的类型值,比如布尔值或者String值,它要么是一个Int,要么什么都没有.)

If Statements and Forced Unwrapping (if语句和强制解包)

  可以使用if语句来确认可选类型是否有值.如果一个可选类型有值,它等价true,如果它没有值,等价false.

  一旦确定可选类型有值,可以通过在可选类型名的后面添加一个感叹号(!)来访问内部的值,感叹号的含义是:”我知道这个可选类型有一个值,请使用这个值”.这就是所谓可选类型值的  强制解包.

    if convertedNumber {

        println("(possibleNumber) has an integer value of (convertedNumber!)")

    } else {

        println("(possibleNumber) could not be converted to an integer")

    }

    // prints "123 has an integer value of 123”

  关于更多的if语句,请参考流程控制(Control Flow).

  注意点:

  试图使用感叹号(!)访问一个没有值的可选类型将触发运行时的错误.在使用强制解包可选类型是,一定要确认它是有值的.

Optional Binding (可选绑定)

  使用可选绑定可以判断一个可选类型是否包含值,并会生成一个临时的常量或者变量保存这个值.可选绑定常常与if和while语句一起来检测可选类型包含的值.

  可以像下面的代码一样,使用可选绑定在if语句中:

    if let constantName = someOptional {

      statements

    }

  在下面的代码中,你也可以使用可选绑定来重写possibleNumber例子,而不使用强制解包:

    if let actualNumber = possibleNumber.toInt() {

         println("(possibleNumber) has an integer value of (actualNumber)")

    } else {

        println("(possibleNumber) could not be converted to an integer")

    }

    // prints "123 has an integer value of 123”

  上面代码可以理解为:

  “如果possibleNumber.toInt返回的Int可选类型包含一个值,那么将这个值赋值给叫做actualNumber的常量”

  如果条件成立,在if语句的第一个分支语句中常量actualNumber就会有值,这个值正是包含在可选类型内的值,并且用它初始化了常量actualNumber.因此不再需要使用感叹号!后最来  访问这个值.在上面的代码样例中,actualNumber只是用来打印输出这个结果.

  可选绑定可以用常量也可以用变量.如果你想在if的第一个分支语句中操作actualNumber的值,你可以用if var actualNumber 来替代,这样包含在可选类型中的值,将会赋值给变量而不  是常量.

原文地址:https://www.cnblogs.com/caios/p/3791679.html