背景:昨天又有一个小师妹向我请教swift 的optional相关问题,她对于“?”,"!"十分疑惑,都快要放弃学习swift,今天我重新梳理一遍,希望对大家有帮助,欢迎大家多多指导。
一、Optional定义:
1. optional 是 swift 新加入的类型,所以学过 OC 的童鞋就知道在 OC 中是没有这个概念的。可选型的意思简单理解是:有值得时候就有值,无值的时候就是 nil 。
2. swift 中的 nil 和其他语言中的 nil 还有些不一样,nil 自己本身就是一种类型,没有就是 nil ,是和其他类型严格区分开的。可选型的定义很简单:类型 + ? 。比如 String?、Int?、Float? 等,这里需要注意的是 String? 和 String 是完全不同的两个类型,前者是 String 类型的可选型,后者是 String 类型。
示例:
这里会报错,string 类型的变量不能赋值nil,改为可选型即可,var name: String? = "loveway" name = nil
二、Optional的解包
可选型是不能够被直接使用的(因为 swift 是类型安全的,可选型的值又可能会是 nil,如果不做处理可能导致程序 crash),如果我们想使用可选型的值,那么在这之前我们需要做的一项工作就是:解包(unwarp)!
1.强制解包所谓的强制解包意思就是我知道这个类型是可选型,但是在我的程序执行到这里的时候我可以保证它是有值得,所以我要在这里使用它。具体表现形式就是在可选型后面加个 !,如下
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")
}
一般常用这种
三、显式/隐式可选
1.区别:
隐式的可选型(!),它的作用就是,当你这个类没有被初始化的时候他是没有值的,但是当你这个类初始化以后,你可以确保他是有值的,所以这里声明为隐式的可选型。
注意:同样需要注意的是隐式的可选型也是可选型,如果你需要用它的值,你也是要进行判断的。如果不进行判断而直接使用,可能会造成不可预料的后果!
四、综述:
1.String 和String? 是不同类型的,String不能被赋值nil。
2. 对于Optional类型的拆包一定要做判断:拆包的几种比较安全的办法:1)if 语句 + 强制拆包(!);2)Optional Binding (if let);
3. 最安全的确保一个值不为nil的情况是声明为NormalType;
页面更新:2024-05-14
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号