Swift-Optional(可选类型?!)

使用可选类型(optionals)来处理值可能缺失的情况
C和Objective-C中没有可选类型这个概念。最接近的是Objective-C中的一个方法要么返回一个对象要不返回nil,nil表示”缺少一个合法的对象“。然而这只作用于对象,对于结构体,基本的C类型或者枚举类型不起作用。对于这些类型,Objective-C方法一般会返回一个特殊值(NSNotFound)来暗示值缺失。这种方法假设方法的调用者知道并记得特殊值进行判断。然而Swift的可选类型可以让你暗示任意类型值的缺失,并不需要一个特殊值

Swift中的nil和objective-C中的nil并不一样,在Objective-C中,nil是一个指向不存在的对象的指针,在Swift中,nil不是指针,而是一个确定的值用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型

可选类型声明

    var  aStr :String?
    var bStr :Optional<String>

这两种类型的声明是一样的,其实Optional是一个枚举值,包含了两个元素None、Some,可以理解为,这是一个Optional类型的值,要么包含一个String类型的值(Optional.Some)要么就是nil(Optional.None)

使用

一个Optional类型的值是没有办法对其直接操作的,例如上面的声明,

     let anum =  aStr.toInt()

这里写图片描述
怎么使用Optional类型的值?如果不确定该值是否为nil,那在直接操作的时候需要加上”?”,如果为nil,则不继续下一步操作,如果不为nil,则强制拆包执行后续操作(例如方法)

if语句强制解析
let anum = aStr!.toInt()当直接对可选类型进行强制解析(拆包),你必须确定,200%的确定该值一定不能为nil,否则在运行时会有发生Crash的风险。因此为了安全使用if语句

  if  aStr != nil
  {
     let b = aStr!.toInt()
  }

在上面语句中”!”的意思是确定该可选类型有值,可以使用

可选绑定(Optional binding)
使用可选绑定来判断可选类型是否包含值,如果包含就把值赋给一个临时变量或者常量。可选绑定可以用在if和while语句中来对可选类型的值进行判断。

        if let c = aStr
        {
            let b = aStr!.toInt()
        }

隐式解析可选类型
可选类型暗示了常量或者变量可以没有值(nil)。如果在程序架构中,第一次被赋值之后可以确定一个可选类型总是有值,如果每次都要判断和解析可选值的效率是很低的,因为可以确定它总是有值的。所以引入了隐式解析可选类型(implicity unwrapped optionals),在声明可选类型的时候将”?”改成”!”

   var aStr :String!
   let anum = aStr.toInt()
 可以把隐式解析可选类型当做是一个可以自动解析的可选类型,如果没有给隐式解析可选类型赋值就尝试这取值,会发生Crash,和可选类型直接使用”!”取值一样

总结:使用”?”的场景:
1.声明Optional值变量
2.用于安全调用protocol的optional方法
3.使用 as? 向下转型
使用”!”的场景:
1.隐式解析可选类型的声明
2.强制对Optional类型的值拆包

引用:《The Swift Programming Language》
如有问题欢迎指正,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值