美文网首页程序员iOS DeveloperiOS开发
swift中可选类型optional(?和!)的各种使用场景

swift中可选类型optional(?和!)的各种使用场景

作者: LewisZhu | 来源:发表于2017-05-29 11:37 被阅读0次

一.可选类型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!

相关文章

网友评论

    本文标题:swift中可选类型optional(?和!)的各种使用场景

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