我们在swift的开发中会经常遇见?和! ,理解这两个符号深层次的内容对我们的开发是相当有利的;
目前网上对swift3.0的教程还相当的少,如果去搜索会发现早期的说法,在定义变量的时候,swift是不会给变量赋值初始值的,所以当你声明一个字符串变量的时候,var string:String 就会被系统报错,但是目前的swift版本却不报错了。
但是你要给一个字符串赋值未nil的时候,var string:String = nil 就一定是错误的 因为nil并不是一个字符串类型,而实际上他是 optional.none ,正确的写法就应该是 var string:String? = nil;
?在swift中表示可选类型,用于处理值缺失的情况,可选表示那儿有值,并且这个值可以是X或者是空;
!表示强制拆包,他是一种隐式的强制可选类型,表示当前标记的变量一定不为空,当然如果为空的话必崩溃。或者当前标记的变量类型和赋值的类型是一致的。
可选绑定( optional binding )
使用optional binding来判断optional类型是否有值,并且如果有值就把值赋给一个常量或者临时变量。
optional binding可以用在 if 和 while 语句中:
var string:String? = "e" if let test = string { print("当前的可选类型的变量有值") }
隐式解析可选类型 ( implicitly unwrapped optionals )
有时候在编写程序中,一个optional类型第一次被赋值后,可以确定它以后总会有值,
在这种情况下,使用它时每次都还需要判断和解包optional类型是非常低效的,因为可以确定它总会有值,
所以Swift中定义了一个隐式解析可选类型,它在使用时可以自动解析;
把( String? )改成感叹号( String! )就可以声明一个隐式解析可选类型。
let possibleString: String? = "An optional string." let forcedString: String = possibleString! // 需要惊叹号来获取值 let assumedString: String! = "An implicitly unwrapped optional string." let implicitString: String = assumedString // 不需要感叹号
swift 3.0变化
swift3.0对于可选类型控制更加严谨,隐式可选类型和其他类型的运算之后获得的是可选类型而不是隐式可选类型。
let a:Int! = 1 let b = a + 1 // 此时强制解包,b是Int型 let c = a // 注意此时c是Int? 在之前的Swift版本中c是Int!