可选项 Optional
先看下这几句代码:在Swift
中,默认情况下,这些类型不能直接设置为nil
,只有声明为可选类型才可以设置空值
var str: String = "123"
str = nil //报错:'nil' cannot be assigned to type 'String'
var age: Int = 10
age = nil //报错:'nil' cannot be assigned to type 'Int'
1、可选项,一般也叫做可选类型,它允许将值设为nil
2、在类型名称后面加个问号?
,来定义一个可选项
var str: String? = "123"
str = nil
var age: Int? = 10
age = nil
var age1: Int? // 默认就是nil
age1 = 10
age1 = nil
注意点:
var age: Int //没有初始值
print(age) //报错:Variable 'age' used before being initialized
var age: Int? //初始值为nil 相当于:var age: Int? = nil
print(age)
使用例子🌰:get
函数从组数array
中取值,如果传入的index
大于array
的个数,代码会崩溃,所以返回值可以设置为可选类型Int?
,如果index
超出,就返回nil
,保证代码安全。
var array = [1, 15, 40, 29]
func get(_ index: Int) -> Int? {
if index < 0 || index >= array.count {
return nil
}
return array[index]
}
print(get(1)) // Optional(15)
print(get(-1)) // nil
print(get(4)) // nil
强制解包 Forced Unwrapping
1、由于可选项是对其他类型的一层包装,可以理解为一个盒子
如果为nil
,那么它是一个空盒子
如果不为nil
,那么盒子里面装的是:被包装类型的数据
2、要从可选项中取出被包装的数据,需要使用感叹号!
进行强制解包
因为age
的类型是可选项Int?
,并不是Int
,不能直接跟20
相加,类型不一致
var age: Int? = 10
var num = age + 20 //报错:Value of optional type 'Int?' must be unwrapped to a value of type 'Int'
进行强制解包!
之后,类型一致,可以相加
var age: Int? = 10
print(age) // Optional(10)
let ageInt: Int = age!
print(ageInt) //10
var num = ageInt + 20
print(num) // 30
强制解包不影响age
的值,依然是Optional(10)
,只是拿出来使用而已
3、如果对值为nil
的可选项(空盒子)进行强制解包,将会产生运行时错误
var age: Int?
age! //报错:Expression resolves to an unused variable
判断可选项是否包含值
let number = Int("123")
print(number) //Optional(123)
let number1 = Int("abc")
print(number1) //如果转换失败,number为nil
if number != nil {
print("转换成功 == \(number!)")
}
else {
print("转换失败")
} //转换成功 == 123
可选项绑定 Optional Binding
1、可以使用可选项绑定
来判断可选项是否包含值
如果包含就自动解包,把值赋给一个临时的常量let
或者变量var
,并返回true
,否则返回false
if let number = Int("123") {
print("转换成功 == \(number)") //不需要再加感叹号!
// number是强制解包之后的Int值
// number作用域仅限于这个大括号
}
else {
print("转换失败")
} //转换成功 == 123
enum Season: Int {
case spring = 1, summer, autumn, winter
}
if let season = Season(rawValue: 6) { //Season不存在原始值为6的成员
switch season {
case .sprint:
print("the season is spring")
default:
print("the season is other")
}
}
else {
print("no such season")
} //no such season
等价写法
可选项绑定中的条件并列,不能用&&
书写隔开,必须用逗号,
隔开
if let a = Int("4") {
if let b = Int("42") {
if a < b && b < 100 {
print("\(a) < \(b) < 100")
}
}
} // 4 < 42 < 100
if let a = Int("4"), let b = Int("42"), a < b && b < 100 {
print("\(a) < \(b) < 100")
} // 4 < 42 < 100
while循环中使用可选项绑定
var strs = ["10", "20", "abc", "-20", "30"]
var index = 0
var sum = 0
while let num = Int(strs[index]), num > 8 {
sum += num
index += 1
}
print(sum) // 30
隐式解包 Implicitly unwrapped Optional
1、在某些情况下,可选项一旦被设定值之后,就会一直拥有值
2、在这种情况下,可以去掉检查,也不必每次访问都进行解包,因为它能确定每次访问都有值
3、可以在类型后面加个感叹号!
定义一个隐式解包的可选项
let num1: Int! = 10
let num2: Int = num1
if num1 != nil {
print(num1 + 6) // 16
}
if let num3 = num1 {
print(num3) // 10
}
let num1: Int! = nil
let num2: Int = num1 // 运行崩溃:Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
网友评论