美文网首页
swift中的?和!区别

swift中的?和!区别

作者: CoderZb | 来源:发表于2020-08-24 15:19 被阅读0次

?!是什么?这样解释吧,?和!表示Optional类型,即可选类型。在声明变量和操作变量时用到的居多。
有一点需要注意的是,声明成了可选类型,那么创建出来的对象,在调用get方法取值时,也必需对应的加上?或者!。即声明的时候如果用的是!,在使用get方法取值的时,也必须写上!; 声明的时候如果用的是?,在使用get方法取值的时,也必须写上?;。以下针对这声明变量和操作变量这两种情况进行阐述?!区别

?

  • 声明变量时
var gradeArray:[String]?

var gradeArray:[String]?表示声明了一个Optional类型,这个类型可能为数组,也可能为其他类型。
var gradeArray:[String]?可知,没有对gradeArray手动初始化,系统就会自动将gradeArray初始化值为nil,类似于var gradeArray:[String]? = nil
拓展:没有?的情况 var gradeArray:[String],系统不会自动初始化值为nil,因此如果紧接着执行var newArray = gradeArray的话,就会报gradeArray没有进行初始化的错误。

  • 操作变量时
var gradeArray:[String]?   // 表示声明了一个Optional类型,可能为数组
gradeArray = ["A","B","C","D"]// set方法赋值
print("gradeArray为", gradeArray?[2])  // 打印C   

gradeArray?[2]操作变量时,这里使用的是?。如果gradeArray为nil,就不解包执行后面的[2],所以无论如何程序都不会crash。


!

  • 声明变量时

var gradeArray:[String]!var gradeArray:[String]?是一样的,在操作变量时才会有区别

  • 操作变量时
var gradeArray:[String]!    // 表示声明了一个Optional类型,可能为数组
print("gradeArray为", gradeArray![2])  // 报错

var newGradeArray:[String]!    // 表示声明了一个Optional类型,可能为数组
newGradeArray = ["A","B","C","D"]// set方法赋值
print("newGradeArray为", newGradeArray![2])  // 打印C

gradeArray![2]操作变量(调用get方法取值)时,这里使用的是!,所以直接解包,因为gradeArray是nil,所以会报错
newGradeArray![2]操作变量(调用get方法取值)时,这里使用的也是!,所以直接解包。因为gradeArray是有值的而且没有数组越界,所以会正常打印

?!开发中虽然都会用到,都能实现同等的功能,但是尽量都用?。因为?并不像!那样会强制解包,稍微不注意,程序就会崩溃,所以!了解了解就行。

  • 如有问题,请批评指正,改之

相关文章

网友评论

      本文标题:swift中的?和!区别

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