Swift5.1学习随笔之可选项Optional

可选项 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

你可能感兴趣的:(Swift5.1学习随笔之可选项Optional)