Swift - 可选类型详解

 

 

可选类型详解

直接上代码解释

// 类中所有的属性在对象初始化时,必须有初始化值
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)
}

 

posted @ 2017-01-03 15:02  俊华的博客  阅读(1102)  评论(0编辑  收藏  举报