Swift语言使用var定义变量,但是和别的语言不同,swift不会自动给变量赋初始值,也就是申明的变量不会有默认值,所以要求在使用之前不要对其初始化。如果在变量使用之前木有初始化就会报错:
var myString : String
print(myString)
fatal error: unexpectedly found nil while unwrapping an Optional value
Program ended with exit code: 9
Swift的可选(Optionals)类型,用语处理值缺失的情况。意思是:“那儿有一个值”或者“那儿没有值”,使用可选类型可以解决上面的问题。
Swfit语言定义后缀?作为命名类型Optional的简写,换句话说,以下两种声明是相等的:
var myString : String?
var myString : Optional<String>
Optional 是一个含有两种情况的枚举,None和Some(T),用来表示可能有或可能没有值。任何类型都可以明确声明为(或者隐式转换)可选类型。
如果使用了可选类型,使用变量时如果没有赋值,该变量会自动赋值成nil,
var myString : String?
print(myString)
结果:
nil
Program ended with exit code: 0
看出差别了吧:如果不使用‘?’,我们访问未初始化的变量时,程序直接报错,如果使用了‘?’,我们访问未初始化的变量时,变量为空。
强制解析:
当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个感叹号表示”我知道这个可选有值,请使用它。”这被称为可选值的强制解析。如下所示:
var myString : String?
myString = "Hello, Swift!"
print(myString!)
结果
Hello, Swift!
Program ended with exit code: 0
但是如果没有给myString赋值,使用!来访问这个值,就会报错
var myString : String?
print(myString!)
结果
fatal error: unexpectedly found nil while unwrapping an Optional value
如果不使用!访问变量他的结果如下:
var myString : String?
myString = "Hello, Swift!"
print(myString)
结果:
Optional("Hello, Swift!")
Program ended with exit code: 0
看出差别了吧。
自动解析
如果在申明可选变量时使用(!)代替(?),这样可选变量在使用时就不需要加一个(!)来获取值了,它会自动解析:
var myString : String!
myString = "Hello, Swift!"
print(myString)
Hello, Swift!
Program ended with exit code: 0
同样自动解析也不会自动赋初始值,所以在使用之前一定要先赋值,不然也会报错。
总结
1、声明时添加(?),告诉编译器这个是Optional的,如果申明是没有手动初始化,就会自动初始化为nil。
2、在对变量值操作前添加(?),如果判断出变量为空,则不响应后面方法。 当我们希望程序执行时遇到某个变量为空时程序还可以正常执行我们就应该在申明变量时添加(?)。
3、申明是添加(!),告诉编译器这个是Optional的,以后对该变量操作的时候,都隐士的在操作前添加!
4、在对变量操作前添加!,表示该变量不会为nil,直接解包进行处理。