前言
尽量不使用
可选类型(也有叫‘可选项’的),算是Swift的一个特色,可以让程序在编写阶段就发现大部分因为变量为空而导致的问题,提高安全性;(dart的空安全就于此类似,对flutter还不太熟,如果说错,请删除)
何时使用
之前说了 变量声明阶段必须有值,但是实际开发中总有特例,总有在声明或初始化阶段无法确定值的情况,这时就需要可选类型;
如何声明
在变量声明的基础上添加?问号:
var 变量名: 类型名? = 值
eg: var name: String?
这里注意要用var修饰 用let修饰没有意义,'类型名'不可省略,’值‘可以省略;
var name: String?
name = "baidu"
print(name!) // baidu 如果name = nil 会crash
print(name ?? "s")// baidu 如果name = nil 则输出s
print(name as Any)// Optional("baidu") 显然这不是我们想要的 如果name = nil 则输出 nil
if let str = name { // name如果有值,会自动解包并赋值给str
print(str) // baidu
}else{
print("name is nil")
}
var age: Int! = 10 //如果声明时用叹号,将来使用时会隐式解包 非常不建议使用!!!!!
age = 18
let age2: Int = age // 隐式解包只会发生在赋值时?
print(age as Any, age2) // Optional(18) 18 如果age = nil 会crash
怎样理解
可选类型可以理解为一个特殊类型,只有两种情况: 有值(Optional)、无值(nil) 。
然而我们想要使用可选类型中的值,则需要解包。
解包:正好今天换工位,领了一个纸箱,可以把可选类型比作一个纸箱,纸箱中要么是空的,要么有东西。而从有东西的纸箱中取出这个东西的过程成为解包;解包后纸箱就被丢弃,值便裸露出来;
使用中提到了解包,常用的有三种形式:1. 用叹号!是强制解包,不是在非常确定有值的情况下不要使用;2. 用双问号?? 问号左边的变量自动解包如果有值则返回,如果未nil则返回问号右侧的值;3. 用 if let str = name {} ;
可选链
提到可选类型,就得说说可选链:由可选类型的属性构成的调用链条。eg: preson.pet?.name = "Jerry"
class Dog {
var name: String? = "Tom"
}
class Preson {
///宠物
var pet: Dog? = nil
}
let preson = Preson()
preson.pet?.name = "Jerry"
print(preson.pet?.name as Any) // 输出 nil 这里pet右边的问号必须要加,如果pet=nil则不会调用后边的name,而直接返回nil。反之如果?变!则会crash
preson.pet = Dog()
preson.pet?.name = "Jerry"
print(preson.pet?.name ?? "无") // 输出 Jerry
print(preson.pet!.name!) // 输出 Jerry 不建议这样写
网友评论