美文网首页
Swift中的可选类型

Swift中的可选类型

作者: Coulson_Wang | 来源:发表于2017-07-12 00:37 被阅读0次

    原创文章。谈一谈对Swift中可选类型的理解与实际应用,如有错误,望读者指正,谢谢!


    什么是可选类型?

    可选类型是一种用来强检验一个常量或变量是否具有值的语法。可选类型的存在让Swift成为一种强类型语法

    怎么使用可选类型?

    0.可选类型的含义

    可选类型可用于一个对象的初始值的情况。

    由于在Swift中定义一个对象时,必须明确指明其初始值,不能为空值。如果不想在定义时赋予初始值,唯一的办法就是将其定义为可选类型

    需要注意的是:

    可选类型中的nil与OC中的nil代表的含义是不同的。
    OC中的nil表示空指针,代表变量不指向任何内存地址。OC中对空指针发送消息不会发生任何事情
    Swift中nil也是一种类型,表示变量或常量的值缺失。在Swift中使用一个值缺失的对象,将会导致程序崩溃

    1.定义可选类型
    • 常规写法
    var name : Optional<String>
    
    • 快捷写法(常用)
    var name : String? 
    

    </br>

    2.从可选类型中取值
    • 强制解析:
      在可选类型后加上一个"!"即可取得可选类型中的值
    print(name!)
    

    强制解析是危险操作,如果对象的实际值为nil,解包会导致crash。所以如果不能确定对象必然有值,不建议直接使用强制解析,而是先进行一次校验:

    if name != nil {
        print(name!)
    }
    
    • 可选绑定(常用)
      写法1:
    if let tempName = name {
        print(tempName)
    }
    

    这个语句会先判断name是否有值,如果没有值,则判断条件为false,不会执行{}中的语句。 如果name有值,则系统会对其进行解包,将解包后的结果赋值给tempName
    写法2:

    if let name = name {
        print(name)
    }
    

    利用了变量作用域的原理,用临时变量覆盖了原本的变量。本质上与写法1一样

    • 通过guard的方式进行可选绑定(常用)
      由于在Swift中除了if可以进行条件判断外,还可使用guard进行判断。因此同样可以使用guard语句进行可选绑定:
    guard let name = name else {
      return
    }
    

    guard校验与if类似,如果name有值,则进行赋值,跳过else中的代码。如果name为nil,则只需else中的语句,不再继续往下执行

    • 空合运算符(摘自 <<The Swift Programming Language>>中文翻译)
      空合运算符即??,使用示例如下:
    realName = name ?? ""
    

    表示如果name有值时则将name解析并赋值给realName,否则则将运算符后的默认值(即空字符串)赋值给realName

    </br>
    </br>

    "!"和"?"运算符的含义

    在Swift中经常可以看到这两个运算符,那么他们到底有哪些含义呢?

    一.?

    1.用在三目运算符中,表示条件选择,例如:

    let isAdult: Bool = (age > 18) ? true : false
    

    当?之前的条件为真时,执行问号后的语句,否则执行冒号后的语句

    2.用在定义一个变量时,用来表示该变量为可选类型,例如:

    var name: String?
    

    之后给这个变量赋值时,可以赋一个确定有值的String,也可以赋值为nil

    3.用在语句中,根据变量的值是否为nil决定是否继续执行代码,例如:

    var person: Person?
    person?.name.firstName = "Wang"
    

    如果person的实际值为nil,则整句代码都不会执行。如果person不为nil,则会执行代码,对firstName赋值

    4.在赋值时,使用"??"来进行条件判断,赋默认值,例如:

    var age: Int = person.age ?? "10"
    

    如果person的age值不为nil,则会给变量age赋值。如果为nil,则将默认值10赋值给age

    5.跟在as后,表示可选的类型转换,例如:

    let str: String? = "abc"        
    let nsStr = str as? NSString
    

    这句代码将会把str转化为一个NSString?的对象。nsStr的类型是NSString?,即可选类型。
    as?常用在向下转型,也就是将子类的对象转化为父类对象。

    6.用在执行协议中的可选方法时。因为遵循协议的代理不一定实现了可选方法,所以在调用可选方法时,需要在方法名后加上一个?。如果实现了方法,则会调用,否则不执行

    "?"的用法基本就这些了,如果有遗漏的,欢迎补充。

    二.!
    未完待续!

    相关文章

      网友评论

          本文标题:Swift中的可选类型

          本文链接:https://www.haomeiwen.com/subject/lzsvhxtx.html