Swift 中的 ? 与 !

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

用法

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

1
2
var sunny: String?
var young: String!

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

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

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

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

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

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

1
2
3
4
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!)