• Swift的可选类型Optional


    1、Optional类型的概念

    可选类型用来表示“有一个值,它等于x或者根本没有值”。当我们遇到Optional类型时,就会明显知道这里的值可能为nil,我们必须谨慎处理。

    2、Optional类型的实现

    1. var optionalInteger: Int?
    2. //或者
    3. var optionalInteger: Int!

    其中?和!都是可选类型的语法

    3、Optional类型的本质

    Optional其实是个枚举(enum)(严格来讲:应该是enum和泛型为基础的高阶抽象类型),分别是None和Some(T),如果可选类型为nil就会命中None的Case。

    1. enum Optional<T> : NilLiteralConvertible, Reflectable {
    2. case None
    3. case Some(T)
    4. //...
    5. }

    如果命中Some(T)的Case,就会得到一个“包装”后的值(a wrapped value),如果想要拿到真正的value,就需要“拆包”,否则你会得到的是Optional(value)。

    4、Optional类型的运用(拆包)

    可选绑定

    可选绑定可以用在if和while语句中来对可选类型的值进行判断并把值赋给一个常量或者变量。

    可以使用可选绑定来判断Optional是否包含值。

    如果包含就自动解包,把值赋给一个临时的常量(let)或者变量(var),并返回true,否则返回false。

    基本语法:

    1. if let constantName = someOptional {
    2. statements
    3. }

    示例:

    1. var myString:String?
    2. myString = "Hello, Swift!"
    3. if let yourString = myString {
    4. print("myString 值为 - \(yourString)")
    5. }else{
    6. print("myString 值为 nil")
    7. }

    强制解包

    Optional是对其他类型的一层包装,可以将它理解为一个盒子

    • 如果为nil,那么它是个空盒子
    • 如果不为nil,那么盒子里装的是被包装类型的数据
    • 如果要从Optional中取出被包装的数据,需要使用感叹号!进行强制解包
    • 如果对值为nil的Optional进行强制解包,将会产生运行时错误。
    1. var myString:String?
    2. myString = "Hello, world!"
    3. if myString != nil {
    4. // 强制解析
    5. print( myString! )
    6. }else{
    7. print("myString 值为 nil")
    8. }

    可选类型不能直接赋给其它类型,如Int?不能直接赋给Int型变量,要先解包,值为nil的可选类型不能解包 

    1. var text: String? = "abc"
    2. print(text) //输出结果为Optional("abc")
    3. print(text!) //输出结果为abc
    4. var a:String
    5. a = text! //强制解包

    隐式拆包

    隐式解包直接在定义时加!

    对于会在viewDidLoad进行初始化的变量,可以直接定义为var str: String!,称为隐式拆包,在进行操作的时候也需要添加!进行拆包。

    1. let text:String! = "abc" //text的类型还是Optional
    2. print(text) //输出结果为Optional("abc")
    3. var a:String
    4. a = text //隐式类型转换
    5. print(a) //输出结果为abc

    !和?的区别

    ?的使用场景:

    • 声明Optional值变量
    • 在对Optional值操作中,用来判断是否能响应后面的操作

    !的使用场景:

    • 强制对Optional值进行拆包
    • 声明隐式拆包变量,一般用于类中的属性


     

  • 相关阅读:
    leetcode 101对称二叉树
    面试总结:H5 移动 web 开发(H5 新特性、CSS3 新特性、如何实现双飞翼(圣杯)布局)
    代码随想录算法训练营第23期day52|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
    基于SSM技术的oa办公管理系统的设计与实现毕业设计源码100934
    AI实战 | 手把手带你打造校园生活助手
    考研:研究生考试(五天学完)之《线性代数与空间解析几何》研究生学霸重点知识点总结之第七课二次型
    jvm基础--JVM内存模型
    JS课程记录-黑马
    python 的configparse 读取ini 文件
    TypeScript9
  • 原文地址:https://blog.csdn.net/watson2017/article/details/132756354