「Optional」小师妹你的苦恼是否能消除?

背景:昨天又有一个小师妹向我请教swift 的optional相关问题,她对于“?”,"!"十分疑惑,都快要放弃学习swift,今天我重新梳理一遍,希望对大家有帮助,欢迎大家多多指导。

一、Optional定义:

「Optional」小师妹你的苦恼是否能消除?

1. optional 是 swift 新加入的类型,所以学过 OC 的童鞋就知道在 OC 中是没有这个概念的。可选型的意思简单理解是:有值得时候就有值,无值的时候就是 nil 。

2. swift 中的 nil 和其他语言中的 nil 还有些不一样,nil 自己本身就是一种类型,没有就是 nil ,是和其他类型严格区分开的。可选型的定义很简单:类型 + ? 。比如 String?、Int?、Float? 等,这里需要注意的是 String? 和 String 是完全不同的两个类型,前者是 String 类型的可选型,后者是 String 类型。

示例:

「Optional」小师妹你的苦恼是否能消除?

这里会报错,string 类型的变量不能赋值nil,改为可选型即可,var name: String? = "loveway" name = nil

二、Optional的解包

可选型是不能够被直接使用的(因为 swift 是类型安全的,可选型的值又可能会是 nil,如果不做处理可能导致程序 crash),如果我们想使用可选型的值,那么在这之前我们需要做的一项工作就是:解包(unwarp)!

1.强制解包所谓的强制解包意思就是我知道这个类型是可选型,但是在我的程序执行到这里的时候我可以保证它是有值得,所以我要在这里使用它。具体表现形式就是在可选型后面加个 !,如下

「Optional」小师妹你的苦恼是否能消除?

但是这样的解包是不安全,因为你不知道什么时候你的这个可选型就会变成 nil,如果我们代码非常多的话,一不小心为 nil了,可能会导致程序崩溃。这个时候我们会想到一种方法:判空!如下,

var name: String? = "Tom"

if name != nil {

"My name is " + name!

} else {

print("name is nil")

}

这是明显的oc翻译

使用 if let 解包使用 if let 解包如下,

* var name: String? = "Tom"

if let name = name {

"My name is " + name

} else {

print("name is nil")

}

一般常用这种

三、显式/隐式可选

「Optional」小师妹你的苦恼是否能消除?

1.区别:

隐式的可选型(!),它的作用就是,当你这个类没有被初始化的时候他是没有值的,但是当你这个类初始化以后,你可以确保他是有值的,所以这里声明为隐式的可选型。

注意:同样需要注意的是隐式的可选型也是可选型,如果你需要用它的值,你也是要进行判断的。如果不进行判断而直接使用,可能会造成不可预料的后果!

四、综述:

1.String 和String? 是不同类型的,String不能被赋值nil。

2. 对于Optional类型的拆包一定要做判断:拆包的几种比较安全的办法:1)if 语句 + 强制拆包(!);2)Optional Binding (if let);

3. 最安全的确保一个值不为nil的情况是声明为NormalType;


展开阅读全文

页面更新:2024-05-14

标签:可能会   赋值   示例   初始化   变量   语句   预料   苦恼   这个概念   疑惑   后果   区别   定义   声明   类型   程序   数码

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top