一.可选类型optional的引入
- 可选类型也是Swift语言新添加的对象。主要是为了解决对象变量或常量为空的情况。在前面定义的变量和常量都不能为空。里面必须要有值。
- Swift中的可选类型则允许变量(常量)中没有值(被设为nil)。要注意的是,Swift中的nil和Objective-C中的nil不一样。前者的nil表示没有值,而后者的nil表示变量值为空。
- 可选类型需要在类型后面加一个问号(?),表示这个变量(常量)在没有初始化的状态下可为nil.
二.可选类型开发中的使用场景
为了方便阅读先将使用场景用图表总结,后面一一举例解释:
序号 | 可选项用处场景 | 详情 |
---|---|---|
1. | 定义时用? | 表示变量可为nil,或者有个值 |
2. | 定义时用! | 表示定义时一定有初始值,但是后面使用的时候可能为nil |
3. | 用!强制解包 | 使用前最好先判断是否为nil,或者用gurd let/var (if let/var)处理 |
4. | 用?可选解包 | 常用于调用方法,如果为nil就什么也不做,不为nil则继续执行 |
5. | 类型转换:as? | 转换时前面的类型是可选的 |
6. | 类型转换:as! | 转换时前面的结果一定有值 |
7. | 类型转换:as | 常用于把OC类型转为swift类型:NSString转为String,NSArray转为[],NSDictionary转为{} |
1.定义时候用"?"
- 在定义变量时候在类型后面加"?",表示这个变量为可选类型,请如果这个变量没有初值,那么就会默认初值为nil。
var oneA: Int? = nil
// oneA现在不包含值
var twoA: String?
//twoA 被自动设置为 nil
2.定义时候用"!",即就是:隐式解包
- 在声明时,通过在类型后面添加!来告诉编译器这是一个隐式解包Optional:在对它的成员或者方法进行访问时,编译器会自动进行解包,被称为隐式解包。
- 定义时候用"!",则一定要有初始值
let testA: String! = "asdf"
let testB: String = testA //此处我们不需要!来对testA 进行显示解包
很显然,隐式解包的写法会带来一个潜在的危险,变量在使用过程中可能被赋为nil,如果尝试访问一个为空的隐式解包Optional, 就会遇到一个runtime error。解决这个问题一般可以用if语句,或者if let/var.
if(testA != nil){
……
}
3.用"!"强制解包
- 同样的在optional类型的使用过程中用"!"来进行强制解包,必须的保证optional类型必须有值。使用前最好先判断是否为nil,建议用gurd let/var (if let/var)处理。
if let testB = testA {
print(testB)
}
guard let testB = testA else{
……
break
}
4.用"?"可选解包
- 可选解包比较简单一般用于方法的调用上面,用可选解包 会对可选类型的类进行判断,如果不为nil,则调用方法。
customeClass?.customeFun(parm:"testParm")
5.类型转换的时候用:as?
- as? 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值(optional),需要我们拆包使用。
- 由于 as? 在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用 as!,否则使用 as?
//Animal的子类是Cat
let animal:Animal = Cat()
if let cat = animal as? Cat{
print("cat is not nil")
} else {
print("cat is nil")
}
6.类型转换的时候用:as!
- 在向下转型(Downcasting)时使用。由于是强制类型转换,如果转换失败会报 runtime 运行错误
//Animal的子类是Cat
let animal :Animal = Cat()
let cat = animal as! Cat
7.类型转换的时候用:as
- <1>从派生类转换为基类,向上转型(upcasts)
//Animal的子类是Cat
let cat = Cat()
let animal = cat as Animal
- <2>消除二义性,数值类型转换
let num1 = 42 as CGFloat
let num2 = 42 as Int
let num3 = 42.5 as Int
let num4 = (42 / 2) as Double
- <3>OC对象转为相应的swift对象,swift底层做了桥接
以上就是swift中optional类型所收集到常用的使用场景,欢迎评论交流,THX!
网友评论