Swift入门(四)——可选类型(Optionals)与断言(Assert)

前端之家收集整理的这篇文章主要介绍了Swift入门(四)——可选类型(Optionals)与断言(Assert)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

可选类型是什么?

首先看一个问题,Swift中String类型的变量有一个叫做toInt的方法,可以把String类型变量转换为Int类型变量。

  1. var stringValue = "5"
  2. var intValue = stringValue.toInt();
  3. println("intvalue = \(intValue)")

执行以上方法后得到了奇怪的结果:

  1. intvalue = Optional(5)

其实,可以发现,toInt方法的返回值并不是Int,而是Int?这是因为Swift提供了一种叫做“可选类型”(Optionals)的新类型。String和Int类型对应的可选类型分别是String?和Int?

因为并不是每个字符串都可以转换为整数,也就是说在执行

  1. var intValue = stringValue.toInt();

这句代码的时候,并不知道intValue的具体值。如果stringValue无法转换为Int类型,那么这里的intValue的值为nil。

和OC不同的是,nil并不是一个空指针,也不只限于对象类型,而表示任意一个可选类型的变量的值缺失。String?和Int?等可选类型的变量值均可以为nil。比如执行以下代码

  1. var stringValue = "53d"
  2. var intValue = stringValue.toInt();
  3. println("intvalue = \(intValue)")

得到的结果会是:

  1. intvalue = nil

可选类型与隐式可选类型

强制解封可选类型

如果想要使用转换后的变量值,而不出现Optional(xxx)这样奇怪的表示的话,可以使用感叹号(!)运算符,强制使用可选类型变量里面的值。这在Swift里面叫做强制解封(Forced unwrapping of the optional’s value)。

然而强制解封一个值为nil 的可选类型会导致运行时错误(runtime error)。因此,在使用感叹号(!)运算符强制解封可选类型变量时,一定要确保可选类型变量的值不为nil。

下面的代码具体解释了之前的概念:

  1. var stringValue1 = "55"
  2. var stringValue2 = "5d"
  3. var intValueNotNil = stringValue1.toInt();
  4. var intValueNil = stringValue2.toInt();
  5. println("intvalue1 = \(intValueNotNil!)") //强制解封,正常运行
  6. println("intvalue2 = \(intValueNil!)") //强制解封,运行时错误

需要再次提醒的是,运行时错误无法被编译器发现,会导致app直接闪退。所以正确的强制解封方案应该如下:

  1. let unknownValue:Int? = 3
  2. //let unknownValue:Int? = nil
  3. if unknownValue != nil{
  4. println("value = \(unknownValue!)")
  5. }
  6. else{
  7. println("value = \(unknownValue)") //不强制解封,直接打印nil
  8. }

还有一点需要注意的是,可选类型在定义的时候必须赋初值。不可以用类型标注的方式跳过赋初值,否则会产生编译错误

可选绑定

Swift是一门简洁的语言,使用强制类型解封来获取可选类型变量里的值过于麻烦,是很多人不愿意使用的。因此,可以通过可选绑定的方式来解封可选类型中的值。

  1. let unknownValue:Int? = 3
  2. //let unknownValue:Int? = nil
  3. if var variable = unknownValue {
  4. println("variable = \(variable)")
  5. }

可选绑定的关键在于if判断里的赋值语句。如果unknownValue的值为nil,if判断不成立。如果unknownValue的值不为nil,那么variable将会得到unknownValue解封后的值,因此在打印variable的时候不再需要使用感叹号(!)运算符。

隐式解封可选类型

隐式解封可选类型简称隐式可选类型,是与可选类型相对的概念。它需要在原基础类型后加上感叹号。比如以下代码可以定义一个隐式可选类型:

  1. var implicitOptional:Int! = 3

隐式可选类型表示默认这个变量中一直有值(即不为nil)。使用隐式可选类型就赋予了Swift自动解封隐式可选类型的权利,不需要调用感叹号(!)运算符即可解封隐式可选类型。

  1. var implicitOptional:Int! = 3
  2. if implicitOptional != nil{
  3. println("implicitOptional = \(implicitOptional)")
  4. }

输出结果:

  1. implicitOptional = 3

需要注意的是,隐式可选类型其实也是一种可选类型,也就是说,如果隐式可选类型的值为nil,依然会触发运行时错误(Runtime Error)。所以在使用隐式可选类型变量时,为了安全起见,还是应该用if语句进行判断。

除了在后文介绍无主引用时提到的隐式可选类型的使用场景外,不建议使用隐式可选类型。直接用可选类型代替即可

隐式可选绑定

隐式可选类型的可选绑定被称为隐式可选绑定,和可选类型的可选绑定在使用上完全一致。不过没有必要仔细研究了。示例代码如下:

  1. var implicitOptional:Int! = nil
  2. //var implicitOptional:Int! = 3
  3.  
  4. if var unknownImplicitOptional = implicitOptional{
  5. println("implicitOptional = \(unknownImplicitOptional)")
  6. }

断言

断言其实与可选类型毫无干系,它的使用可以帮助程序员比较容易的发现和定位错误,使用上也并不难,因此就放在第四章最后一并介绍了。

在Swift中,通过assert函数实现断言,其中第一个参数为判断条件,第二个参数为条件不满足时的打印信息。

  1. let age = 20
  2. assert(age > 20,"你是成年人啦!")

如果断言被触发,将会强制结束程序,并输出相关信息:

  1. assertion Failed: 你是成年人啦!: file /Users/KT/Desktop/MyIOS/Swift练习/Swift——可选类型/Swift——可选类型/main.swift,line 45
  2. (lldb)

使用断言非常简单,但是合理的添加断言,有助于定位和排除bug,是在使用Swift中的一个好习惯。

附录

查看完整专栏——《Swift轻松入门》

【Swift入门(一)——基本语法】
【Swift入门(二)——字符与字符串】
【Swift入门(三)——元组(Tuple)】
【Swift入门(四)——可选类型(Optionals)与断言(Assert)】
【Swift入门(五)——数组(Array)】
【Swift入门(六)——字典(Dictionary)】
【Swift入门(七)——结构体(Struct)】
【Swift入门(八)——功能强大的求余运算符】
【Swift入门(九)——String与Int、Double、Float等数字相互转换】
@L_301_10@
【Swift入门(十一)——类型转换与is、as操作】
【Swift入门(十二)——利用Extension添加逆序输出字符串方法】

猜你在找的Swift相关文章