Swift的可选类型Optional

1、Optional类型的概念

可选类型用来表示“有一个值,它等于x或者根本没有值”。当我们遇到Optional类型时,就会明显知道这里的值可能为nil,我们必须谨慎处理。

2、Optional类型的实现

var optionalInteger: Int?
//或者
var optionalInteger: Int!

其中?和!都是可选类型的语法

3、Optional类型的本质

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)。

4、Optional类型的运用(拆包)

可选绑定

可选绑定可以用在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是对其他类型的一层包装,可以将它理解为一个盒子

  • 如果为nil,那么它是个空盒子
  • 如果不为nil,那么盒子里装的是被包装类型的数据
  • 如果要从Optional中取出被包装的数据,需要使用感叹号!进行强制解包
  • 如果对值为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

!和?的区别

?的使用场景:

  • 声明Optional值变量
  • 在对Optional值操作中,用来判断是否能响应后面的操作

!的使用场景:

  • 强制对Optional值进行拆包
  • 声明隐式拆包变量,一般用于类中的属性


 

猜你喜欢

转载自blog.csdn.net/watson2017/article/details/132756354