前言
我们都知道,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.对于解包,建议使用可选解包,这样不对导致程序崩溃。