美文网首页
Swift中的可选类型

Swift中的可选类型

作者: Coulson_Wang | 来源:发表于2017-07-12 00:37 被阅读0次

原创文章。谈一谈对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!)
}
  • 可选绑定(常用)
    写法1:
if let tempName = name {
    print(tempName)
}

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

if let name = name {
    print(name)
}

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

  • 通过guard的方式进行可选绑定(常用)
    由于在Swift中除了if可以进行条件判断外,还可使用guard进行判断。因此同样可以使用guard语句进行可选绑定:
guard let name = name else {
  return
}

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

  • 空合运算符(摘自 <<The Swift Programming Language>>中文翻译)
    空合运算符即??,使用示例如下:
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.用在执行协议中的可选方法时。因为遵循协议的代理不一定实现了可选方法,所以在调用可选方法时,需要在方法名后加上一个?。如果实现了方法,则会调用,否则不执行

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

二.!
未完待续!

相关文章

网友评论

      本文标题:Swift中的可选类型

      本文链接:https://www.haomeiwen.com/subject/lzsvhxtx.html