• 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值进行拆包
    • 声明隐式拆包变量,一般用于类中的属性


     

  • 相关阅读:
    第一季:导航【Java面试题】
    数据库索引详解
    深度解析NLP文本摘要技术:定义、应用与PyTorch实战
    教育培训系统一般都有哪些功能呢?
    猿创征文|我的Go成长之路道阻且长
    beeline连接报错Required field ‘client_protocol‘ is unset
    Flutter应用框架搭建之屏幕适配
    electron无法设置自己的图标?渲染进程require报错?
    违禁图像易语言检测代码
    SAAS智能打印设计->自定义打印模板
  • 原文地址:https://blog.csdn.net/watson2017/article/details/132756354