Swift之可选项

当值可能存在缺省的情况时,你就可以使用可选项。意思是:有一个值,它可以等于一个x的具体值,也可能没有值。

注意:在C或者Objective-C中没有可选值这这个概念。在Objective-C中有一个和可选项相近的函数,这个函数返回一个nil否则返回一个对象,nil意味着一个有效对象的缺省值。然而,可选项只能用于对象,不能用于结构,基础C类型,或者枚举值。对于这些类型,Objective-C函数通常返回一个特定的值(比如NSNotFound)来说明一个缺省的值。我们可以通过逆向测试方法假设函数的调用者知道有函数有一个特殊值并记得校验。Swift可选项可让你在任何时候指明一个缺省的值,并且不需要一个特定的常量。这儿有个例子说明了缺省值被用于的范围。

 

Swift中的字符串(String)类型有一个叫toInt的函数,这个函数可以把一个字符串转(String)化为一个整数(Int)值。然后,并不是所有的字符串都可以被转换为一个整数,例如字符串"123"可以转换为一个整数123,但是,字符串"hello","world"就不能转换为一个明确的数值。

下边这个例子演示了函数toInt尝试把一个字符串转换为一个整数:

     let possibleNumber="123"

     let convertedNumber=possibleNumber.toInt()

    // convertedNumber 的类型被自动推断出为一个整形可选项,Int?

因为toInt函数可能转换失败,让它返回一个Int还不如返加一个可选项Int?。整数型可选项写作Int?,不是Int。问号标记指明了这个值可能存在可选,这意味着这个值有时可能是一个Int值,有时可能不存在任何值。(它不能包含其它的任何值,比如Bool值或者String字符串,它要么是一个整数,要么什么都没有)。

 

nil

你可以通过一个特殊值nil来设置一个可选变量的值的状态:

     var serverResponseCode: Int? = 404

     // serverResponseCode 包含了一个真实的Int值 404

     serverResponseCode = nil

     // serverResponseCode现在不包含任何值。

注意:nil不能被用于不是可选型的常量和变量。如果一个常量或变量在一些特定的条件下需要一个缺省值,这时就需要把它定义为一个合适类型的可选值。

 

如果你定义可选型的常量或变量时没有提供默认值时,这个常量或变量的值会自动的被设置为nil:

      var surveyAnswer:String?  //  suveyAnswer 的值被自动设置为nil

注意:Swift中的nil和Objective-C的nil不一样。在Objective-C中的nil指向一个不存在的对象,在Swift中nil不是指向一个确定类型的缺省值。任何类型的可选值都可以被设置为nil,不仅仅是对象类型。

 

if条件语句和强制展开可选面的值

你可以用if条件语和比较一个可选是否不等于nil来判断出他的值。你可以用等号(==)操作来比较也可以用不等号(!=)

如果一个可选项有一个值,我们考虑一下它不等于nil的情况:

       if convertedNumber != nil {

            println("convertedNumber contains some integer value")

       }

 一旦你确定一个可选项包含一个值,你就可以通过在可选项名字后边加一个感叹号(!)来访问它。这个感叹号实际上的意思是"我知道这个可选项一定有一个值,请你使用这个值"。这就是所谓的强制展开可选项的值:

       if convertedNumber !=nil {

            println("convertedNumber has an integer value of \(convertedNumber!).")

       }

       // 打印出:convertedNumber has an value of 123.

关于更多的if条件语句信息,请查看"Swift之控制流"章节。

注意:尝试用 ! 来访问一个可选项不存在值时在运行时时会触发一个错误。一定要在用 !来强制展开一个可选项的值之前时确定它包含一个非nil。

     

可选项绑定

 你可以用一个可选项绑定来找到一个可选项是否包含一个值,如果包含,就可把这个有效的值作为一个临时的常量或变量。可选项绑定可以用于if和while语句中用来检查一个可选项内部的值,并取出值放入到一个常量或变量中,作为一个单一操作的一部份。if和while条件语句的详细描述请查阅"Swift之控制流"章节。

我们来写一个用于if条件语句中的可选项绑定的格式:

       if let contantName = someOptional {

             statements

       }

 我们来重写一个上边变量possibleNumber,用可选项绑定还不如用强制展开:

     if let actualNumber = possibleNumber.toInt() {

            println("\'\(possbileNumber)\' has an integer value of \(actualNumber)")

     }

     else {

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

     }

    // 打印出 " '123' has an integer value of 123"

这段代码可以这样来理解:

    "如果可选项 通过possibleNumber.toInt()返回一个Int ,设置一个叫actualNumber的常量来接纳这个可选项的值"

     如果转换成功,actualNumber 常量将会成为有效的,将进行if条件语句中第一个条件分支。它已经通过可选项的值进行初始化,所以可以不需要 !符号来访问它的值。在这个例子中,actualNumber只是简单的用于打印转换结果。

     你也可使用常量和变量与可选项进行绑定。如果你想操作actualNumber的值在if条件语句的第一个分支中,你可以使用 if var actualNumber来替代,这个值接收了这个可选项生成的有效的值并作为一个变量存在而不是一个常量。

 

posted on 2015-04-16 23:37  empty_cup  阅读(979)  评论(0编辑  收藏  举报

导航