在声明一个变量时,如果不手动初始化,Swift不会自动初始化该变量为一个默认值的。
在OC语言中,创建一个字符串,如果没有对其进行初始化的时候,为了防止野指针,我们会这样做:
NSString *string = nil;
将字符串置为nil,但是在swift语言中的做法是:
var str :String?
就是告诉编译器这是一个Optional的变量,如果没有初始化,你就将其初始化为nil
而通过!声明,则之后对该变量操作的时候都会隐式的在操作前添加一个!。
var arrayCount = array?.count
这时问号的意思类似于isResponseToSelector,即如果变量是nil,则不能响应后面的方法,所以会直接返回nil。如果变量非nil,就会拆Some(T)的包,取出原始值执行后面的操作。
var arrayCount = array!.count
这里的叹号和之前的问号则不同,这里表示我确定array一定是非nil的,所以直接拆包取出原始值进行处理。因此此处如果不小心让array为nil,程序就会crash掉。
总结
问号?
1.声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil
2.在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。
叹号!
1.声明时添加!,告诉编译器这个是Optional的,并且之后对该变量操作的时候,都隐式的在操作前添加!
2.在对变量操作前添加!,表示默认为非nil,直接解包进行处理
网友评论