可选类型详解
直接上代码解释
// 类中所有的属性在对象初始化时,必须有初始化值 class Person : NSObject { var name : String? var view : UIView? var age : String? } // 1.定义可选类型 // 1>普通定义可选类型的方式 var name : Optional<String> // 2>语法糖 //这样写默认为空 var name : String? // 2.给可选类型赋值 name = "why" // 3.从可选类型中取值 print(name) // Optional("why") // 从可选类型中取值:可选类型!-->强制解包 //print(name!) // 4.注意:如果可选类型中没有值,那么强制解包程序会崩溃 // 强制解包是非常危险的操作:建议在解包前先判断可选类型中是否有值 if name != nil { print(name!) print(name!) print(name!) }
"?" 这个简单意思,你的变量可能为nil,或者你可能将nil赋值给它,需要给变量定义的时候加上"?",否则一旦你将nil赋值给没有加"?"的变量,编译就会报错
举个例子理解一下,我们假如有一个盒子,盒子是一个存在的物体,swift不允许有空值出现,那我们怎么办呢?就需要把空值装到一个盒子里面,系统检查的时候,发现有一个盒子,哦,好的,检测通过,但是如果你把盒子打开系统就会报错
打印name 输出
Optional("why")
发现有个Optional 就说明这个变量被包着,那么怎么才能不让它包裹着呢? 很简单, 给变量加一个"!"
print(name!) //输出 why
我们还有一种解包的方式
let nickName: String? = nil let fullName: String = "XUJIE" let name = nickName ?? fullName //如果第一个解包值发现为nil,则使用第二值 print(name)
?? 的使用还有一个注意点
先看下面的例子
let a:Int! = 3 let b = 4 // 如果a不为nil则对a进行解包,赋值将b的值付给c let c = a != nil ? a! : b //??的用法相当于上面 let c = a ?? b // 如果a为nil则使用b的值替换a的值,如果a不为nil,则对a解包然后将值付给b
再看一个例子
let a:Int??? = 3 let b = 4 let c = a ?? b // 分析对a进行一次解包,得到的值不为nil,所以把解包后的值付给c print(a) print(c)
运行结果:
Optional(Optional(Optional(3))) Optional(Optional(3))
再看一个例子(问题来了哦)
let a:Int??? = nil let b = 4 let c = a ?? b print(a) print(c)
有些人已经猜到答案 nil 4 但我告诉你答案不是这样的,先来分析一下
首先a,有三个包Optional(Optional(Optional(nil))),当我们解掉第一次包后,发现值为nil,此时,我们需要将b的值替换给a,Optional(Optional(4))
所以我们的最终显示结果为:
nil Optional(Optional(4))
可选绑定(判断可选类型中是否有值)
let urlString = "http://www.520it.com" let url : URL? = URL(string: urlString) // 1.普通写法 if url != nil { let request = URLRequest(url: url! ) } // 可选绑定 if let url = url { let request = URLRequest(url: url) } // 可选绑定的简介写法 if let url = URL(string: urlString) { let request = NSURLRequest(url: url) }