一:先说? 和 ! 是什么
? 和 ! 其实分别是Swift语言中对一种可选类型( Optional) 操作的语法糖。 那可选类型是干什么的呢? Swift中是可以声明一个没有初始值的属性, Swift中引入了可选类型(Optional)来解决这一问题。它的定义是通过在类型生命后加加一个 ? 操作符完成的。
二 :? 和 ! 使用
先用几行代码简单展示下
let name : String?
let sex : String!
我们看到声明一个常量(变量)后面加上? !其实都可以编译通过,目前两个值都为nil
那我们在看一下调用的时候有什么区别,我们就用最简单的print()来分别打印不同情况
name = "asdasd"
sex = "asdasd"
print(name ?? 为nil情况处理")
print(name!)
print(sex ?? "asd")
print(sex!)
print(sex)
我们看到 当调用 用?生成的name的时候,有两种情况可以
第一种是 值 + ?? + "为nil情况处理"
这句代码运行的含义是当你用 ?? 调用用 ? 生成的常量(变量)时,如果当前的值为nil ,则会直接跳过 ?? 前面的方法,直接调用??后面的方法.
第二种是 !
这句代码运行的含义是当你用 ! 调用用 ? 生成的常量(变量)
! 代表了硬解包,意味者这个变量(常量)肯定有值,如果没有值 会crash 所以我们在用!拆包时,一定要注意你这个值是否为空
我们再看当调用 用!生成的sex的时候的情况
第一种
print(sex ?? "asd")
这个跟上边代表的含义是一样的,不多说
我们主要看
print(sex!)
print(sex)
这两个方法
变量(常量)后面!可加可不加
这代表了当你用!去生成一个变量(常量) 在每次对这种类型的值操作时,都会自动在操作前补上一个!进行拆包,然后在执行后面的操作,当然如果该值是nil,依然会crash
最后做个简单总结
?
声明:
(1)告诉编译器这个是Optional的,如果不赋值,初始化为nil.
调用:
当用?? 表示当值不为nil ,调用此变量,为nil时,执行?? 后面的方法 .
当用! 强行拆包,有值则可执行.为nil时则crash.
!
声明:
(1)告诉编译器这个是Optional的,如果不赋值,初始化为nil.之后对此操作,都隐式的进行硬解包
调用:
(1)当用?? 表示当值不为nil ,调用此变量,为nil时,执行?? 后面的方法 .
(2)当直接调用不加 ? !则隐隐式的进行强行拆包,有值则可执行.为nil时则crash.
注:写的比较匆忙,如果有疑问,或者我表述有问题,希望及时指出,在做修改!
网友评论