Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29383
  • 博文数量: 49
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-20 22:39
文章分类

全部博文(49)

文章存档

2014年(49)

我的朋友

分类: iOS平台

2014-06-24 20:11:39


你可以在某个值可能缺失的情况下,使用可选类型。可选类型也就是:

  • 要么有值,等于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语句和强制拆箱

你可以使用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 不能用于非可选类型的常量和变量。如果要在你的代码中处理变量或者常量缺失值的情况,一定要将他们声明为恰当的可选类型。

如果你在定义可选类型的变量或者常量的时候,没有指定默认值的话,那么系统或自动赋给它nil的。

注意:

Swift的nil和Objective-C中的nil是不一样的。在Objective-C中,nil是指向一个不存在对象的指针,而在Swift当中,nil不是一个指针,它代表某中类型值的缺失。任意类型的可选类型都可以赋予nil,而不只是对象类型的。
 

可选类型的隐式拆箱

就像上面描述的一样,可选类型表明一个变量或者常量允许没有值。可以使用if语句检查一个可选类型是否有值,如果有值的话,就可以使用绑定将可选类型进行拆箱。

有时候,从你的代码结构当中可以清楚的知道一个可选类型一旦服了赋了值,之后总是有值的。在这种情况下,就没有必要每次访问可选类型,都经过检查和拆箱了,因为我们明确的知道它一直都是有值的。

我们就上面这种情况的可选类型定义为隐式拆箱的可选类型。在你想将将它变成可选的类型后面,加上叹号(!)而不是问号(?),就可以将它定义为隐式拆箱的可选类型了。

当一个可选类型第一次定义之后,可以很明确的知道之后它一定有值的话,隐式拆箱是非常有用的。在Swift中,隐式拆箱的主要作用就是在类的初始化过程中,参考“无主引用和隐式拆箱可选类型属性

隐式拆箱的可选类型其实就是一个普通的可选类型,只不过可以像普通的变量一样使用,不用每次访问的时候都拆箱了。下面的例子展示了一个可选类型的String和一个隐式拆箱的可选类型的String之间的区别:

你可以把一个隐式拆箱的可选类型想象成无论什么时候使用它,你都已经授权给他让他自动拆箱了。在声明可选类型的时候,在后面加上叹号(!),这样你就不用每次访问值的时候,都在后面加上叹号(!)了。

注意:

如果你在访问一个隐式拆箱的时候,它没有值,就会触发一个运行时错误。结果和在一个普通的可选类型后面加上叹号时的效果是一样的。

你可以把隐式拆箱看成一个普通的可选类型来检查它时候有值:

你也可以隐式拆箱上面使用绑定,来在同一句话当中实现检查和拆箱:

注意:

如果一个变量的值可能在之后变成nil,那么就不应该使用隐式拆箱了。如果你在一个变量的声明周期当中需要检查它是否为nil 的话,请使用普通的可选类型。

 

阅读(236) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~