?
和!
是什么?这样解释吧,?和!表示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是有值的而且没有数组越界,所以会正常打印
?
和!
开发中虽然都会用到,都能实现同等的功能
,但是尽量都用?
。因为?
并不像!
那样会强制解包,稍微不注意,程序就会崩溃,所以!
了解了解就行。
网友评论