swift-基础08-隐式解析,隐式装包,强制装包和断言


    可选暗示了常量或者变量可以没有值

    可选可以通过 if 语句来判断是否有值,如果有值的话可以通过可选绑定来解析值。

    有时候在程序中,第一次被赋值之后,可以确定一个可选总会有值。

    在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。

    这种情况下的可选类型可以被定义为:隐式解析可选(implicitly unwrapped optionals)。

    声明一个隐式解析可选的方式是:把可选的类型的后面的问号(String? )改成感叹号(String! )。

    一个隐式解析可选本质上是一个普通的可选,但是可以被当做非可选使用,

    并不需要每次都使用解析来获取可选值。

    下面的例子说明了可选 String 和隐式解析可选 String 的区别:

    

    let possibleString:String? = "An optional string"

    print(possibleString!)

    

    let assumedString:String! = "An implicitly string"

    print(assumedString!)

    

    可以把隐式解析可选当做一个可以自动解析的可选。

    只要声明的时候把惊叹号!放到类型的结尾,而不是在每次取值时,把惊叹号!放到可选名字的结尾。

    如果隐式解析可选没有值,尝试取值会触发运行时错误。

    和在没有值的普通可选后面加一个惊叹号是一样的。

    

    当然,仍然可以把隐式解析可选当做普通可选来判断它是否包含值

    

    在可选绑定中使用隐式解析可选来检查并解析它的值

    如果一个变量值可能变成 nil 的话请不要使用隐式解析可选。

    如果你需要在变量的生命周期中判断是否是 nil 的话,请使用普通可选

    

    隐式装包是拆包的逆过程,即“不可空类型”转变成“可空类型”

    由于可空类型比不可空类型的精度高,因此这是一个“泛化”过程

    由于没有精度的损失,因此在swift中这个过程是自动进行的

    当我们将一个不可空类型赋值给一个可空类型时,隐式装包自动发生

    如:

    let a = 1

    var b: Int ? = a


   强制装包,

   我们也可以强制装包,将一个非可空类型转变为可空类型

   如上例子中

   var a:Int = 1

   var b:Int ? = Optional(a)

   由于隐式装包和强制装包的效果是相同的。大部分情况下,

   当我们需要将一个不可空类型转变为对应的可空类型时,我们使用隐式装包即可


    if let definiteSting = assumedString {

      

      print(definiteSting)

  

    } else {

      

      print(assumedString)

    

    

    }

    

    可选会让你检查可能存在的或者也可能不存在的值,

    这样,你就可以在编码过程中处理缺乏的值。

    然而,在某些情况下,如果值不存或者不满足某些条件时,你的代码可能不需要继续执行。

    在这些情况下,你可以在代码结束执行之前触发一个断言(assertion),

    并通过调试来查找值缺失或无效的原因

  

    断言会在运行时判断一个逻辑条件是否为true

    

    断言:

    如果条件的结果为 true,代码正常执行;

    如果条件的结果为 false,代码执行结束,并终止应用程序。

    

    在调试环境中触发断言:

    比如当你在 Xcode 构建和运行一个应用程序,断言触发时,

    你可以看到错误状态发生的确切位置和查询应用程序的状态。

    此外,断言允许你附加一条调试信息。

    

    你可以使用全局 assert 函数来写一个断言。

    assert 函数传入一个结果为 true 或者 false 的表达式以及一条信息,

    当表达式为 false 的时候这条信息会被显示:

    

    let age = -3

    

    assert(age >= 0, "An age cannot be less than zero ")

    

    在这个例子中,只有 age >= 0 的时候代码才会继续运行。

    如果 age 的值是负数,那么 age >= 0 false,断言被触发,结束应用。

    

    断言信息不能使用字符串插值。

    断言信息可以省略,就像这样

    

    assert( age >= 0 )

   

    当条件可能为假时触发断言,但是最终一定要保证条件为真,这样代码才能继续运行。

    断言的适用情景:

    整数下标索引被传递一个定制的下标实现,下标索引值可能太小或者太大。

    给函数传入一个值,但是非法的值可能导致函数不能正常执行。

    可选值现在是 nil,但是后面的代码运行需要一个非nil值。

    

    断言会导致应用终止运行,所以代码的设计要避免非法条件的出现。

    但是,在应用发布之前,非法条件的出现触发断言可以快速发现问题。

   

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值