swift 可选项(Optional)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift 可选项(Optional)相关的知识,希望对你有一定的参考价值。

参考技术A 可选项、一般也叫可选类型,它允许将值设置为nil

在类型名称后面加个 ?(问号)来定义一个可选项

例:

如上图所示:在默认情况下 是不允许将值置为nil
只有将其声明为可选类型才可以将值置为你了 如下两种方式

name 为可选类型 默认设置了初始值

age没有设置初始值 但是默认情况就是 nil

注意区分:
如果声名一个变量 但是没有赋初始值 我们就无法使用这个变量 如下

如果我们只是声名了这个变量 但是并没有给其赋值 它是没有默认值的 然后你去使用它 就会报错 如下

这一点 要和可选项分开 可选项如果不设置默认值 它的默认值就是 nil

比如 自定义一个函数 传入一个下标 返回数组对应的元素

如果返回值 定义为可选项
我们传入的下标 大于数组的长度 在此时就会返回nil

如果返回值 定义的不是可选类型
我们传入的下标 大于数组的长度 在此时就会奔溃报如下错误

强制解包(也就是取值) 就是直接在变量后面加一个 !(感叹号) 这样就把值给取出来了
例:直接打印变量

例:打印强制解包的变量

之所以产生上述原因 是因为 num 并不是Int类型的数据 它的类型是 Int?
所以 我们也无法直接与Int类型的数据相加
例:

注意:如果对一个可选项 值为nil 的变量 进行强制解包 也会报错 所以我们在强制解包的时候一定要确定 变量值不为 nil

概念:
1、可以使用可选项绑定来判断可选项是否包含值
2、如果包含就自动解包,把值赋给一个临时的常量(let)或者变量(var),并返回true,否则返回false

例:将字符串强转int (结果是 有可能转换成功 也有可能转换失败 )

例:根据key值到字典中取出对应的value (结果 如果有对应的key 则取出 如果没有对应的key 则返回nil)

规则:
a ?? b
1、 a 是可选项
2、b 是可选项 或者 不是可选项
3、b 跟 a 的存储类型必须相同
如果 a 不为nil,就返回 a
如果 a 为nil,就返回 b
如果 b 不是可选项,返回 a 时会自动解包

例1: a为可选项 初始值不为nil b (可以是可选项 也可以不是可选项)

例2: a为可选项 初始值为nil b 是可选项

例3: a为可选项 初始值为nil b 不是可选项

例4: a为可选项 初始值不为nil b 不是可选项

所以 我们在使用 空合并运算符 ?? 来获取可选项的值时 后面经常会跟一个与 可选项 值类型相同的 非可选项
如下

Swift之Optional 可选值

  • Optional 是 Swift 的一大特色,也是 Swift 初学者最容易困惑的问题
  • 定义变量时,如果指定是可选的,表示该变量可以有一个指定类型的值,也可以是 nil
  • 定义变量时,在类型后面添加一个 ?,表示该变量是可选的
  • 变量可选项的默认值是 nil
  • 常量可选项没有默认值,主要用于在构造函数中给常量设置初始数值
//: num 可以是一个整数,也可以是 nil,注意如果为 nil,不能参与计算
let num: Int? = 10
  • 如果 Optional 值是 nil,不允许参与计算
  • 只有解包(unwrap)后才能参与计算
  • 在变量后添加一个 !,可以强行解包

注意:必须要确保解包后的值不是 nil,否则会报错

//: num 可以是一个整数,也可以是 nil,注意如果为 nil,不能参与计算
let num: Int? = 10

//: 如果 num 为 nil,使用 `!` 强行解包会报错
let r1 = num! + 100

//: 使用以下判断,当 num 为 nil 时,if 分支中的代码不会执行
if let n = num {
    let r = n + 10
}

常见错误

unexpectedly found nil while unwrapping an Optional value

翻译

在[解包]一个可选值时发现 nil

?? 运算符

  • ?? 运算符可以用于判断 变量/常量 的数值是否是 nil,如果是则使用后面的值替代
  • 在使用 Swift 开发时,?? 能够简化代码的编写
  • 等同于三目运算
let num: Int? = nil

let r1 = (num ?? 0) + 10
print(r1)

以上是关于swift 可选项(Optional)的主要内容,如果未能解决你的问题,请参考以下文章

Swift之深入解析可选类型Optional的底层原理

Swift之深入解析如何处理非可选的可选项类型

[翻译]理解Swift中的Optional

Swift-可空链式调用(Optional Chaining)(十五)

Swift-可空链式调用(Optional Chaining)(十五)

关于swift中的可选类型