Swift是一门类型安全的语言。出于安全考虑,默认变量不为空。但编码中有一些方面必须考虑为空的情况,比如类型转换,只要可能为空,就可能带来大量的潜在崩溃风险。Swift的解决方式是声明可选型变量,以将不确定因素控制在可选型范围内。
可选型在OC中没有类似概念,Swfit作为一门安全的编程语言,有可选型的概念。比如var age: Int? 就表明age是Int型的可选型变量(可选型是通过一个枚举实现的,有值返回值,无值返回nil)。在使用的时候,age可能返回一个Int数据,也可能返回空。在进行类型转换,强转之类的,解包,之类的,可能会因为类型不同返回空等,这时该变量可能是空,就需要可选型去声明,去填坑,防止可能的BUG
类中可声明可选型变量,这样在后续编程时就知道该值可能为空,使用要注意。
var name: String?
可选型的变量,可以不在构造器中初始化,编译器不会因此报错,否则必须在构造器中实现
安全起见,可以把可选型转换成对应的非可选性变量,这样后续操作就不用提心吊胆是否为空了,用到的操作就是解包。
比如,最普通的解包方式如下三种
var age: Int? //表明age是Int的可选型变量,不必在构造其中声明也可以通过编译
age = Int(“12”) //初始化了age,但此时如果打印age,输出的是Optional(12)
Let newAge= age! //
第一种,对age进行解包,并付给newAge,此时newAge不需要声明为可选型即可通过编译
let newAge2 = age as! Int//第二种,强制转换成Int,如果age确实不能转,会直接崩溃
let newAge3 = age as? Int //第三种,安全转型,如果age确实不能转,会返回一个nil,但不会因为转型而失败
上述解包方式优劣势很明显,没有容错,解包失败直接崩溃。??运算符能在一定程度上解决上述问题
var age: Int? = Int(“12”)
let newAge = age ?? -1 //此处??返回的结果是12,如果age可选型解包后是空,则默认后面的-1,不会直接崩溃
相比较强制解包,Swift提供另外两种可选绑定的解包方式,更安全,分别是if-let,guard-let-else。Demo如下
let age: String? = Int(“12”)
If let a = age {
Print(a) //表明age解包成a成功,
}
guard let a = age else {
print(“解包失败”)
return
}
print(“解包成功,a = \(a)”)
//在此使用解包后的值
两者区别主要是一个
先处理解包正常情况,一个先处理解包异常情况,无他。
可选链
首先,别害怕,这不是类似于响应链之类的概念,只是个小技巧而已。
如果说a是一个可选型,if-let就能对其安全解包。如果你关心的是a下面的可选型的变量,那就要用两个if-let嵌套调用。如果三层的话,就需要用三层if-let。这样的代码不够美观,可以用以下方式代替。
//example返回一个可选型的类,类中age是可选型的变量,一行即可可选绑定的方式安全解包
if let a = example(code: "xw")?.age {
print("age == \(a)")
}
隐式解包
Swift中X?表示可选型变量,使用!可对可选型进行解包。其实Swift中给还有X!这种类型,这种类型叫做隐式解包。隐式解包是一种特殊的可选型,我们工作过程中除非万不得已,不要主动创建隐式解包的类型。
隐式解包类型可以和普通类型进行运算,编译器不会报错,此时他会被解包(如果解包失败则直接崩溃),结果返回的也是非可选的类型。
let a: Int! = Int("12") //变量a是隐式解包类型,
let b = a + 1 //隐式解包类型a,经过+1运算,自动进行解包成Int进行运算,b变成了非可选的类型
let c = a //隐式解包类型a直接赋给c,c也是隐式解包类型,
let d = a + 1 - 1 //隐式解包类型a经过+1-1运算赋给了d,虽然+1-1数值未变化,但已经解包成了非可选型,
let arr = [1,a] //数组只能存放一种数据类型数据,a是隐式解包类型数据,因此arr变成了隐式解包类型的数组,此时即使是取第一个1,也是可选型数据
Any/AnyObject
Any/AnyObject和OC中的id概念比较接近,目前多用在Swift,OC桥接时作为参数,返回值。他俩的区别呢,主要是AnyObject只能作为class的泛型指针,如果是Int等,就不能用AnyObject,只能用Any;Any的话,范围就广了,各种变量,乃至方法等,都能用Any。简单说,AnyObject是Any的子集,
PS:可选型放入数组再取出的问题
无意中发现一个问题。将一个可选型数据,放入数组,再取出来,数据类型就变成了X??,也就是说可选了两次,需要解包两次才能变成非可选型,有点纳闷。后经过研究后发现,使用数组的first,last等方法取元素时,返回的是一个可选型,?,系统方法只是取出了对应元素,并把它写成可选型的变量(可选型只是个枚举嘛),并没有判断元素是否是可选型,就需要你自己处理如何解包了。也就是说,使用first等返回可选型的方法,是需要默认跟上一个解包的操作的。