Swift中的可选类型

2017-07-12  本文已影响0人  Coulson_Wang

原创文章。谈一谈对Swift中可选类型的理解与实际应用,如有错误,望读者指正,谢谢!


什么是可选类型?

可选类型是一种用来强检验一个常量或变量是否具有值的语法。可选类型的存在让Swift成为一种强类型语法

怎么使用可选类型?

0.可选类型的含义

可选类型可用于一个对象的初始值的情况。

由于在Swift中定义一个对象时,必须明确指明其初始值,不能为空值。如果不想在定义时赋予初始值,唯一的办法就是将其定义为可选类型

需要注意的是:

可选类型中的nil与OC中的nil代表的含义是不同的。
OC中的nil表示空指针,代表变量不指向任何内存地址。OC中对空指针发送消息不会发生任何事情
Swift中nil也是一种类型,表示变量或常量的值缺失。在Swift中使用一个值缺失的对象,将会导致程序崩溃

1.定义可选类型
var name : Optional<String>
var name : String? 

</br>

2.从可选类型中取值
print(name!)

强制解析是危险操作,如果对象的实际值为nil,解包会导致crash。所以如果不能确定对象必然有值,不建议直接使用强制解析,而是先进行一次校验:

if name != nil {
    print(name!)
}
if let tempName = name {
    print(tempName)
}

这个语句会先判断name是否有值,如果没有值,则判断条件为false,不会执行{}中的语句。 如果name有值,则系统会对其进行解包,将解包后的结果赋值给tempName
写法2:

if let name = name {
    print(name)
}

利用了变量作用域的原理,用临时变量覆盖了原本的变量。本质上与写法1一样

guard let name = name else {
  return
}

guard校验与if类似,如果name有值,则进行赋值,跳过else中的代码。如果name为nil,则只需else中的语句,不再继续往下执行

realName = name ?? ""

表示如果name有值时则将name解析并赋值给realName,否则则将运算符后的默认值(即空字符串)赋值给realName

</br>
</br>

"!"和"?"运算符的含义

在Swift中经常可以看到这两个运算符,那么他们到底有哪些含义呢?

一.?

1.用在三目运算符中,表示条件选择,例如:

let isAdult: Bool = (age > 18) ? true : false

当?之前的条件为真时,执行问号后的语句,否则执行冒号后的语句

2.用在定义一个变量时,用来表示该变量为可选类型,例如:

var name: String?

之后给这个变量赋值时,可以赋一个确定有值的String,也可以赋值为nil

3.用在语句中,根据变量的值是否为nil决定是否继续执行代码,例如:

var person: Person?
person?.name.firstName = "Wang"

如果person的实际值为nil,则整句代码都不会执行。如果person不为nil,则会执行代码,对firstName赋值

4.在赋值时,使用"??"来进行条件判断,赋默认值,例如:

var age: Int = person.age ?? "10"

如果person的age值不为nil,则会给变量age赋值。如果为nil,则将默认值10赋值给age

5.跟在as后,表示可选的类型转换,例如:

let str: String? = "abc"        
let nsStr = str as? NSString

这句代码将会把str转化为一个NSString?的对象。nsStr的类型是NSString?,即可选类型。
as?常用在向下转型,也就是将子类的对象转化为父类对象。

6.用在执行协议中的可选方法时。因为遵循协议的代理不一定实现了可选方法,所以在调用可选方法时,需要在方法名后加上一个?。如果实现了方法,则会调用,否则不执行

"?"的用法基本就这些了,如果有遗漏的,欢迎补充。

二.!
未完待续!
上一篇下一篇

猜你喜欢

热点阅读