1、可选项 optional 可以赋值为nil,其他类型不能赋值为nil,空合并运算符 ??,a ?? b 返回值的类型
// MARK: 可选项 optional 可以赋值为nil,其他类型不能赋值为nil,空合并运算符 ??,a ?? b 返回值的类型
func testOptional() {
var name: String? = "jack"
name = nil
// 强制解包 对值为nil的可选项强制解包,会产生运行时错误(崩溃)
let age: Int? = 10
print(age!)
if name == nil {
print("name is nil")
} else {
print(name!)
}
let num = Int("123") // num为optional类型
if num != nil {
print("字符串转整数成功:\(num!)")
} else {
print("转换失败")
}
// 自动解包 可选项自动解包的作用域只限于大括号内
if let number = Int("123") {
// 此时number已经自动解包为int类型而不是optional类型
print("字符串转整数成功:\(number)")
}
// 可选项 optional同事满足多个条件不能使用&,而要使用逗号,连接
if let first = Int("4"),
let second = Int("42"){
print("success")
}
// 空合并运算符 ??
// a ?? b 返回值的类型跟b类型一致
// 如果a不为nil,就返回a, 并且如果b不是可选项时,返回a时会自动解包
// 如果a为nil,就返回b
// a 是可选项, b 可选项 或 不是可选项 均可
// b与a的存储类型必须相同
let a: Int? = 1
let b: Int? = 2
let c = a ?? b
print("c=\(String(describing: c))")
let e: Int? = 3
let f: Int = 4
let g = e ?? f
print("g=\(g)")
}
// MARK: 可选项 隐式解包
// 隐式解包的可选项 num1为可选项 !为隐式解包,当为nil时不能使用!隐式解包
// lldb 指令 frame variable -R 或者 fr v -R 查看变量的内存布局
func hiddenOptional() {
let num1: Int! = 10
let num2: Int = num1
print(num1 ?? 0,num2)
}
- 可选项与switch
var age: Int? = 10
switch age {
// ? 在此相当于解包
case let v?:
print(v)
case nil:
print("2")
}
等价于:
if let v = age {
print(v)
} else {
print("2")
}