可选类型用来表示“有一个值,它等于x或者根本没有值”。当我们遇到Optional类型时,就会明显知道这里的值可能为nil,我们必须谨慎处理。
- var optionalInteger: Int?
- //或者
- var optionalInteger: Int!
其中?和!都是可选类型的语法
Optional其实是个枚举(enum)(严格来讲:应该是enum和泛型为基础的高阶抽象类型),分别是None和Some(T),如果可选类型为nil就会命中None的Case。
- enum Optional<T> : NilLiteralConvertible, Reflectable {
- case None
- case Some(T)
-
- //...
- }
如果命中Some(T)的Case,就会得到一个“包装”后的值(a wrapped value),如果想要拿到真正的value,就需要“拆包”,否则你会得到的是Optional(value)。
可选绑定可以用在if和while语句中来对可选类型的值进行判断并把值赋给一个常量或者变量。
可以使用可选绑定来判断Optional是否包含值。
如果包含就自动解包,把值赋给一个临时的常量(let)或者变量(var),并返回true,否则返回false。
基本语法:
- if let constantName = someOptional {
- statements
- }
示例:
- var myString:String?
- myString = "Hello, Swift!"
- if let yourString = myString {
- print("myString 值为 - \(yourString)")
- }else{
- print("myString 值为 nil")
- }
Optional是对其他类型的一层包装,可以将它理解为一个盒子
- var myString:String?
- myString = "Hello, world!"
- if myString != nil {
- // 强制解析
- print( myString! )
- }else{
- print("myString 值为 nil")
- }
可选类型不能直接赋给其它类型,如Int?不能直接赋给Int型变量,要先解包,值为nil的可选类型不能解包
- var text: String? = "abc"
- print(text) //输出结果为Optional("abc")
- print(text!) //输出结果为abc
- var a:String
- a = text! //强制解包
隐式解包直接在定义时加!
对于会在viewDidLoad进行初始化的变量,可以直接定义为var str: String!,称为隐式拆包,在进行操作的时候也需要添加!进行拆包。
- let text:String! = "abc" //text的类型还是Optional
- print(text) //输出结果为Optional("abc")
- var a:String
- a = text //隐式类型转换
- print(a) //输出结果为abc
?的使用场景:
!的使用场景: