Swift 中的 ? 与 !

在Swift中多出了这两个玩意?!,到底是什么鬼?!

用法

在声明变量的时候会用到:

var sunny: String?  
var young: String!  

在调用变量进行使用操作会用到:

sunny?.isEmpty  
young!.isEmpty  //其实这里可以这样写young.isEmpty  

普通情况下,在声明一个变量的时候如果不手动初始化,则不会自动给该变量一个初始的默认值:

var sunny: String   //没有任何值  
println(sunny)      //报错  

对于在类型后面加了?的变量为Optional变量,如果不给定初始值,则系统会自动给它一个默认初始值为nil

对于在类型后面加了!的变量如果不给定初始值,则同样也会自动给它一个默认初始值为nil

var sunny: String?  //值为nil  
var young: Int?     //值同样为nil  
var hahaha: Number! //值同样为nil  
println(sunny)      //不报错  

区别

然而在调用self.sunny?的时候,如果sunny为nil则直接返回nil,在调用self.hahaha的时候,!的意思是该变量一定有值并返回,如果该变量为nil的话,是会报错的。同时在取Optional变量的确切值的时候,需要加上!,例如println(self.sunny!)