本文来自于疯子们的开源图书
你可以在某个值可能缺失的情况下,使用可选类型。可选类型也就是:
要么有值,等于x
要么就什么都没有
注意:
可选类型的概念在C和Objective-C当中是不存在。Objective-C当中最相近的东西就是,一个返回对象类型的函数,可以返回nil.nil表示不存在一个有效的对象。但是,这个只适用于对象,对于结构体,基本的C类型,枚举,就不行了。对于这些类型,Objective-C的方法通常返回一个特殊值(比如NSNotFound)表示值的缺失。这种方法假设方法的调用者知道要返回一个特殊值来进行判断。Swift的可选类型可以让你表示任何类型值的缺失,再也不用那些特殊的常量了。
这里有个例子。Swift 的String 类型有个方法toInt,它可以将字符串转成整型。但是,不是每个字符串都可以转换成整型的。比方说,”123“可以转换成数字123,但是"hello ,world"就没有明显的整型可以转成的了。
下面的例子使用toInt方法,将字符串转成整型:
由于toInt方法可能会失败,它返回一个可选类型的Int,而不是单纯的Int。一个可选类型的Int写作Int?,而不是Int.问号表示当前变量是可选类型的,意味着变量可能包含整型值,或者根本什么都没有(但不能包含其他的类型,比如Bool,String.记住,要么Int型,要么什么都没有)。
你可以使用if语言来判断一个可选类型的变量是否包含值。如果它确实包含值,那么就是true.如果它根本没有值,那就是false.
一旦你确定该可选类型的变量缺失有值的话,你就可以通过在变量名称后面加上叹号(!)的方式访问潜在的值。叹号很有效的说明了:“我知道这个可选类型确实有值,放心的用去吧”。这个就是所谓的可选类型的强制拆箱。
注意:
尝试在一个没有值的可选类型上使用!, 会引发运行时错误。在使用!强制拆箱一个可选类型之前,一定要确保它有一个非nil值。
你可以通过绑定一个可选类型到一个常量或者变量中,不仅可以检测可选类型是否含有值,还可以在之后通过这个临时变量或者常量访问他的值。通过一个操作,就可以在If 和while当中使用绑定来检查可选当中的值,同时也可以将可选的值放到变量或者常量当中。if和while语句在流程控制当中有详细的描述。
像下面这样,在if语句当中实现可选类型的绑定:
你可以使用绑定代替强制拆箱,重写上面的possibleNumber例子:
上面的代码意思就是:
如果possibleNumber.toInt返回的可选Int变量包含值的话,就将可选变量的值赋给新的常量actualNumber.
如果上面的转换是成功的话,就可以在if语句当中使用actualNumber了。它已经用可选变量的值初始化过了,因此就没必要在使用!了。这个例子只是使用actualNumber来打印一下转换结果。
绑定一个可选类型,既可以使用常量,也可以使用变量。如果你想在if语句当中操作actualNumber,你也可以写成if var actualNumber,那么可选类型就是作为变量了,而不是常量了。
你可以通过给一个可选类型的变量赋予nil,来让他处于没有值的状态:
注意:
nil 不能用于非可选类型的常量和变量。如果要在你的代码中处理变量或者常量缺失值的情况,一定要将他们声明为恰当的可选类型。
如果你在定义可选类型的变量或者常量的时候,没有指定默认值的话,那么系统或自动赋给它nil的。
注意:
Swift的nil和Objective-C中的nil是不一样的。在Objective-C中,nil是指向一个不存在对象的指针,而在Swift当中,nil不是一个指针,它代表某中类型值的缺失。任意类型的可选类型都可以赋予nil,而不只是对象类型的。
就像上面描述的一样,可选类型表明一个变量或者常量允许没有值。可以使用if语句检查一个可选类型是否有值,如果有值的话,就可以使用绑定将可选类型进行拆箱。
有时候,从你的代码结构当中可以清楚的知道一个可选类型一旦服了赋了值,之后总是有值的。在这种情况下,就没有必要每次访问可选类型,都经过检查和拆箱了,因为我们明确的知道它一直都是有值的。
我们就上面这种情况的可选类型定义为隐式拆箱的可选类型。在你想将将它变成可选的类型后面,加上叹号(!)而不是问号(?),就可以将它定义为隐式拆箱的可选类型了。
当一个可选类型第一次定义之后,可以很明确的知道之后它一定有值的话,隐式拆箱是非常有用的。在Swift中,隐式拆箱的主要作用就是在类的初始化过程中,参考“无主引用和隐式拆箱可选类型属性”
隐式拆箱的可选类型其实就是一个普通的可选类型,只不过可以像普通的变量一样使用,不用每次访问的时候都拆箱了。下面的例子展示了一个可选类型的String和一个隐式拆箱的可选类型的String之间的区别:
你可以把一个隐式拆箱的可选类型想象成无论什么时候使用它,你都已经授权给他让他自动拆箱了。在声明可选类型的时候,在后面加上叹号(!),这样你就不用每次访问值的时候,都在后面加上叹号(!)了。
注意:
如果你在访问一个隐式拆箱的时候,它没有值,就会触发一个运行时错误。结果和在一个普通的可选类型后面加上叹号时的效果是一样的。
你可以把隐式拆箱看成一个普通的可选类型来检查它时候有值:
你也可以隐式拆箱上面使用绑定,来在同一句话当中实现检查和拆箱:
注意:
如果一个变量的值可能在之后变成nil,那么就不应该使用隐式拆箱了。如果你在一个变量的声明周期当中需要检查它是否为nil 的话,请使用普通的可选类型。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。