zoukankan      html  css  js  c++  java
  • Swift中的? ! as as? as!

    ?:

    代表这是个可选类型(optional)的。如下,如果num有就为Int类型的,如果没有值那么就是nil。

    let num:Int?

    当我对number进行显示赋值时那么number就是Int类型的,如果没有对number电视赋值,那么number就为nil类型

    let number:Int? = 2

    !:

    如果要操作一个optional类型的变量,需要先进行强解包,这就需要用到!了,如果有值就会得到变量的值,如果为nil那么程序就会crash

    // 定义一个string的可选类型str,显式赋值
    var str: String? = "Hello"
    let message = "你好" + str!
    print(message)
    // 定义一个string的可选类型str,不进行显式赋值,就会出现crash
    var str2:String?
    let message2 = "你好" + str2!
    print(message2)

    在第二段中就会报如下错误:

    Fatal error: Unexpectedly found nil while unwrapping an Optional value

    as

    有保证的转换,从派生类转换为基类的向上转型(upcasts)

    使用场合1:从派生类转换为基类,向上转型

    class Animal {}
    class Cat: Animal {}
    let cat = Cat()
    let animal = cat as Animal

    使用场合2:数值类型转换----消除二义性

    let num1 = 42 as CGFloat
    let num2 = 42 as Int
    let num4 = (42 / 2) as Double

    使用场合3:switch 语句中进行模式匹配

    //如果不知道一个对象是什么类型,你可以通过switch语法检测它的类型,并且尝试在不同的情况下使用对应的类型进行相应的处理。
    switch animal {
    case let cat as Cat:
        print("如果是Cat类型对象,则做相应处理")
    case let dog as Dog:
        print("如果是Dog类型对象,则做相应处理")
    default: break
    }

    as!

    强制类型转换,向下转型(Downcasting)时使用,如果转换失败会报 runtime 运行错误。

    官方解释说这是一个不被保证的转换,可能会因为强转的失败而会导致崩溃。同时 !是一个陷阱的标志,就像⚠️一样,用起来存在一定危险性。

    class Animal {}
    class Cat: Animal {}
    let animal :Animal  = Cat()
    let cat = animal as! Cat

    as?

    [as?] 和 [as!] 操作符的转换规则完全一样。但 [as?] 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值(optional)。由于 [as?] 在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用 [as!] ,否则使用 [as?] 。

    let animal:Animal = Cat()
    if let cat = animal as? Cat{
        print("cat is not nil")
    } else {
        print("cat is nil")
    }

    参考链接:

    swift里 as、as!、as?区别

  • 相关阅读:
    VMware Workstation-虚拟机的安装
    Linux操作系统-命令-free
    Linux操作系统-命令-vmstat
    抛出一个异常
    字符集
    页面缓存
    表单域
    弹出式说明
    canselBubble 和 stopPropagation理解
    JS---递归函数理解
  • 原文地址:https://www.cnblogs.com/xjf125/p/10097691.html
Copyright © 2011-2022 走看看