美文网首页iOS DeveloperiOS开发实用技巧
Swift中?和!的使用和区别

Swift中?和!的使用和区别

作者: Arackboss | 来源:发表于2017-05-24 12:41 被阅读0次

    在Swift中!和?一般用在声明变量和对变量进行操作两种情况

    1.声明变量

    var number: Int?
    var str: String?

    2.对变量进行操作

    number?.hashValue
    str!.hashValue

    1>.声明变量时

    在声明一个变量时,如果不手动初始化,Swift不会自动初始化该变量为一个默认值的。

    var a: String //如果像这样写,swift会直接报Class 'xxx' has no initializers的错误,是因为没初始化
    var b = a // error :因为没有初始化a,a没有值

    但是对于Optional的变量则不同,Optional的变量在声明时如果不初始化,Swift会自动将该变量初始化为nil。声明变量时在类型后添加?或者!,就是告诉编译器这是一个Optional的变量,如果没有初始化,你就将其初始化为nil

    var a: String? // a 为nil

    var b: String? // b 为nil

    var a_test = a // a_test 为nil

    var b_test = b // b_test 为nil

    但是这两者之间还是有一些区别的。

    声明变量时的?只是单纯的告诉Swift这是Optional的,如果没有初始化就默认为nil,而通过!声明,则之后对该变量操作的时候都会隐式的在操作前添加一个!。

    Optional事实上是一个枚举类型,从下图可以看出,Optional包含None和Some两种类型,而nil就是Optional.None,非nil就是Optional.Some。如果Optional变量在声明时不初始化,Swift会调用init()来初始化变量为nil,而用非nil的值初始化变量时,会通过Some(T)把该原始值包装,所以在之后使用的时候我们需要通过解包取出原始值才能使用。


    2>.对变量进行操作时

    var arrayCount = dataList?.count

    这时问号的意思类似于isResponseToSelector,即如果变量是nil,则不能响应后面的方法,所以会直接返回nil。如果变量非nil,就会拆Some(T)的包,取出原始值执行后面的操作。

    var arrayCount = dataList!.count

    这里的叹号和之前的问号则不同,这里表示我确定dataList一定是非nil的,所以直接拆包取出原始值进行处理。因此此处如果不小心让dataList为nil,程序就会crash掉。

    总结

    问号?

    a.声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil
    b.在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。

    叹号!

    a.声明时添加!,告诉编译器这个是Optional的,并且之后对该变量操作的时候,都隐式的在操作前添加!
    b.在对变量操作前添加!,表示默认为非nil,直接解包进行处理

    相关文章

      网友评论

        本文标题:Swift中?和!的使用和区别

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