Swift入门基础:可选类型

前言

我们都知道,Swift语言相对其他编程语言来说,引入了一些新语法。了解和掌握这些语法是学习或使用Swift语言的基础。这里,结合自身的经验,系列地介绍下Swift的新语法,希望能帮助需要帮助的人。

首先要介绍的是可选类型(Optional)。

概念

Swift的可选类型,主要用于值缺失的情况。它表示可能存在一个值,也可能没有值

一般地,我们声明一个变量,默认情况下是非可选类型(non-optional),也就是说,变量需要赋初值并且不能为nil。如:

var num:Int = 10 
var str:String = "hello"

如果你硬要把一个非可选类型的变量赋值为nil,那么编译器就会报错。例如var num:Int = nil。为什么会报错呢?因为编译器针对nil,只能用于可选类型,非可选类型不能赋值nil。

可选类型的使用

对于可选的声明,一般有如下两种方式:

 1. var num:Optional
 2. var num:Int?  

 对于上述两个式子,声明一个可选变量,若没有提供初始值,它的值会默认为nil。

可选类型分析

看源码定义(在Optional.swift文件):

enum Optional {
    case none
    case some(Wrapped)
}

它就是一个枚举类型。当前枚举接收一个泛型参数Wrapped。

当Wrapped有值时,走some流程,其值就是Wrapped的值;

若Wrapped没有值,就走none流程,什么也没有,就是nil。

实例化起来就是:

声明一个可选类型的变量

war age:Int?=10

转化为:

switch age{
  case nil:
    print("age 为nil") 
  case.some(let val):
    print("age的值是\(val)")
}

可选类型解包

可选类型就像一个容器一样,外面包裹了一层,实际的数据是在可选类型内部。对于不解包的可选类型是不能运算的。例如

 var a:Int? =10
 var b:Int? = 5
 var sum:Int = a + b

//这里不能做加号运算。因为a + b 实际上是 Optional(10)+Optional(5)。

需要对可选类型解包。目前有两种解包方式:

1.强制解包

2.可选项解包 

强制解包

顾名思义就是不管内部值是否有值,直接解包。若内部没有值,直接解包,程序就会崩溃。

强制解包的方式:

一般通过在可选值后面加上!,例如

上例中var sum:Int = a!+ b! 

这种方式看似简洁,但会忽略编译器警告,并且当结果为nil时会直接闪退。

能确定某个值不可能是nil时,使用强制解包

若存在没值的情况,不能使用强制解包.因一强制解包,程序就崩溃。

可选解包

可选解包比强制解包就优雅些,它先做是否有值判断。若没有值就返回nil,否则就返回真实值。这样的好处是程序不会崩溃。

可选项解包,一般有以下两种方式 

1.if let:如果有值,则会进入if流程

2.guard let:如果为nil,则进入else流程

if - let

if - let 语句会检查可选值是否为 nil,如果不是nil,便会解包可选值。​​​​​​​

if let num = num1{
    print(num)
} else {
   //没有值,nil
}

guard - let

guard let 刚好是 if not let 的意思,可选解包为nil的情况,走guard的else部分,一般直接返回。正常流程继续执行。感觉就是异常流程就直接返回,正常流程继续执行。

func test(value:Int) {
   guard let v = value else{
    return  //没有值,nil
   }
   // 不为nil流程
   ....
   print(value)
}

隐式解包

隐式解包,是在声明类型的时候,加上!。区别强制解包

这种方式声明的变量,在使用的时候系统会强制解包,可不是可选类型。一旦值为nil,使用时候依然会程序崩溃。 

例如:

let num:Int!= 12  //Int!仍然是可选类型

num += 1    //13

系统强制解包num,如果num为nil,就会崩溃。

避免可能的程序崩溃有两种方式:

1.确定隐式解包没有为nil的情况。就可以放心的使用。

2.若存在nil的情况,可使用可选解包。

例如:

 if let tmpNum = num {
     tmpNum += 1
 }

可选值绑定

使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。在可选类型中,我们已经使用了可选值绑定。

if let num = num1 {


}
guard let v = value else{
    return  //没有值,nil
}

好处就是判断可选类型是否有值。

Object-C中nil与Swift中的nil的区别

OC:nil是一个指向不存在对象的指针,只有对象类型才能赋值为nil。

Swift:nil不是指针,是一个确定的值。任何类型的可选状态都可设置为nil,不只是对象类型。

OC:nil只对类(class)有用,

Swift:可选类型对所有的类型都可用且更安全。

OC:对nil对象发送消息是安全的,不会崩溃;(delegate?.handle()//delegate如果为nil,handle将不会被执行)Swift:可通过可选链实现。

总结:

1.声明变量的时候,若存在可能为有值或者没有值的情况,可以考虑使用可选类型。

2.可选类型的使用需注意:要解包才能使用。

3.对于解包,建议使用可选解包,这样不对导致程序崩溃。

你可能感兴趣的:(IOS开发,swift,开发语言,ios)