一、可选类型的介绍
-
在OC开发中,如果一个变量暂时不使用,可以赋值为0
[基本属性类型]
,或者赋值为空[对象类型]
-
在Swift中,
nil
是一个特殊的类型,因为和真实的类型不匹配是不能赋值的[Swift是强类型语言]
-
但是开发中难免会赋值
nil
,因此推出了可选类型
-
可选类型取值:
空值
&有值
二、定义可选类型
- 方法一:基本写法
var name : Optional<String> = nil
- 方法二:语法糖
[常用]
var name2 : String? = nil
三、给可选类型赋值
name = Optional("July")
四、代码理解
//MARK: 可选项
//最常见错误 Unexpectedly found nil while unwrapping an Optional value
//在解包过程中,发现了 nil 值
/**
定义 可选项使用 ?
解包 !
*/
func optionalMethod() -> () {
//1.原始定义
//none 没有值 | some 某一类值
let x : Optional = 10
//2.简单定义
//'?' 用来定义 y 是一个可选的 Int 类型,可能没有值,也可能有一个整数
let y : Int? = 20
//输出Optional(10) Optional(20),提示是一个可选值
print(x)
print(y)
//print(x + y) 不同类型之间的值不能直接运算,如果没有值是 nil,不是任何数据类型,所以不能参与计算
//"!" 强行解包 从可选值中强行获取对应的非空值
//程序中要少使用 "!"
print(x! + y!)
}
func optionalMethod1() -> () {
//定义y,但并没有初始化
let y : Int?
//给常量设置数值,初始化工作只能做一次
y = 20
// *** var的可选值默认为 nil
// *** let 没有默认可选值
}
五、 可选项判断
- if
// opationalJudge(x : 10, y : nil)
//MARK: 可选项 判断
func opationalJudge(x : Int?, y : Int?) -> () {
//强行解包有风险
//print(x! + y!)
//可以使用 if 来判断,但是判断条件多了 代码看起来就会很丑陋
}
- ??
//??
func opationalJudge1(x : Int?, y : Int?) -> () {
/**
?? 是一个简单的三目
如果有值,使用值
如果没有值,使用 ?? 后面的值代替
?? 的优先级低,在使用的时候最好加上 ()
*/
print((x ?? 0) + (y ?? 0))
}
- if let 连用
// if let 连用,判断对象的值是否为 nil ,进入之后,ox 和 oy 一定有值,不需要解包
// if var 连用,{} 可以对值进行改变
func opationalJudge2() -> () {
let oA: String? = "DD"
let oB: Int? = 10
if let a = oA,let b = oB {
//进入之后,a 和 b 一定有值,不需要解包
print(a + String(b))
}
}
- guard
// guard 和 if let / if var 刚好相反
func opationalJudge3() -> () {
let oA: String? = "DD"
let oB: Int? = 10
//guard let 守护一定有值,如没有就返回
guard let a = oA,let b = oB else {
print("有值为nil")
return
}
//来到这里之后,a 和 b 一定有值,不需要解包
print(a + String(b))
}
网友评论