zoukankan      html  css  js  c++  java
  • Swift入门(四)——可选类型(Optionals)与断言(Assert)

    可选类型是什么?

    首先看一个问题,Swift中String类型的变量有一个叫做toInt的方法,能够把String类型变量转换为Int类型变量。

    var stringValue = "5"
    var intValue = stringValue.toInt();
    println("intvalue = (intValue)")

    执行以上方法后得到了奇怪的结果:

    intvalue = Optional(5)

    事实上,能够发现,toInt方法的返回值并非Int,而是Int?这是由于Swift提供了一种叫做“可选类型”(Optionals)的新类型。String和Int类型相应的可选类型各自是String?和Int?

    由于并非每一个字符串都能够转换为整数,也就是说在执行

    var intValue = stringValue.toInt();

    这句代码的时候。并不知道intValue的详细值。假设stringValue无法转换为Int类型,那么这里的intValue的值为nil。

    和OC不同的是,nil并非一个空指针,也不仅仅限于对象类型,而表示随意一个可选类型的变量的值缺失。

    String?和Int?等可选类型的变量值均能够为nil。比方执行下面代码:

    var stringValue = "53d"
    var intValue = stringValue.toInt();
    println("intvalue = (intValue)")

    得到的结果会是:

    intvalue = nil

    可选类型与隐式可选类型

    强制解封可选类型

    假设想要使用转换后的变量值。而不出现Optional(xxx)这样奇怪的表示的话,能够使用感叹号(!

    )运算符。强制使用可选类型变量里面的值。这在Swift里面叫做强制解封(Forced unwrapping of the optional’s value)。

    然而强制解封一个值为nil 的可选类型会导致执行时错误(runtime error)。因此,在使用感叹号(!

    )运算符强制解封可选类型变量时。一定要确保可选类型变量的值不为nil。

    下面的代码详细解释了之前的概念:

    var stringValue1 = "55"
    var stringValue2 = "5d"
    var intValueNotNil = stringValue1.toInt();
    var intValueNil = stringValue2.toInt();
    println("intvalue1 = (intValueNotNil!

    )") //强制解封。正常执行 println("intvalue2 = (intValueNil!)") //强制解封,执行时错误。

    须要再次提醒的是,执行时错误无法被编译器发现。会导致app直接闪退。所以正确的强制解封方案应该例如以下:

    let unknownValue:Int? = 3
    //let unknownValue:Int?

    = nil if unknownValue != nil{ println("value = (unknownValue。)") } else{ println("value = (unknownValue)") //不强制解封,直接打印nil }

    另一点须要注意的是。可选类型在定义的时候必须赋初值。不能够用类型标注的方式跳过赋初值。否则会产生编译错误。

    可选绑定

    Swift是一门简洁的语言,使用强制类型解封来获取可选类型变量里的值过于麻烦,是非常多人不愿意使用的。因此,能够通过可选绑定的方式来解封可选类型中的值。

    let unknownValue:Int? = 3
    //let unknownValue:Int? = nil
    if var variable = unknownValue {
        println("variable = (variable)")
    }

    可选绑定的关键在于if推断里的赋值语句。假设unknownValue的值为nil,if推断不成立。假设unknownValue的值不为nil,那么variable将会得到unknownValue解封后的值。因此在打印variable的时候不再须要使用感叹号(!

    )运算符。

    隐式解封可选类型

    隐式解封可选类型简称隐式可选类型,是与可选类型相对的概念。它须要在原基础类型后加上感叹号。比方下面代码能够定义一个隐式可选类型:

    var implicitOptional:Int! = 3

    隐式可选类型表示默认这个变量中一直有值(即不为nil)。使用隐式可选类型就赋予了Swift自己主动解封隐式可选类型的权利。不须要调用感叹号(!

    )运算符就可以解封隐式可选类型。

    var implicitOptional:Int! = 3
    if implicitOptional != nil{
        println("implicitOptional = (implicitOptional)")
    }

    输出结果:

    implicitOptional = 3

    须要注意的是,隐式可选类型事实上也是一种可选类型。也就是说,假设隐式可选类型的值为nil,依旧会触发执行时错误(Runtime Error)。所以在使用隐式可选类型变量时,为了安全起见。还是应该用if语句进行推断。

    除了在后文介绍无主引用时提到的隐式可选类型的使用场景外,不建议使用隐式可选类型。直接用可选类型取代就可以

    隐式可选绑定

    隐式可选类型的可选绑定被称为隐式可选绑定,和可选类型的可选绑定在使用上全然一致。

    只是没有必要细致研究了。演示样例代码例如以下:

    var implicitOptional:Int! = nil
    //var implicitOptional:Int! = 3
    
    if var unknownImplicitOptional = implicitOptional{
        println("implicitOptional = (unknownImplicitOptional)")
    }

    断言

    断言事实上与可选类型毫无干系,它的使用能够帮助程序猿比較easy的发现和定位错误。使用上也并不难,因此就放在第四章最后一并介绍了。

    在Swift中。通过assert函数实现断言,当中第一个參数为推断条件,第二个參数为条件不满足时的信息打印。

    let age = 20
    assert(age > 20, "你是成年人啦!")

    假设断言被触发。将会强制结束程序,并输出相关信息:

    assertion failed: 你是成年人啦!: file /Users/KT/Desktop/MyIOS/Swift练习/Swift——可选类型/Swift——可选类型/main.swift, line 45
    (lldb) 

    使用断言非常easy。可是合理的加入断言,有助于定位和排除bug,是在使用Swift中的一个好习惯。

    附录

    查看完整专栏——《Swift轻松入门》

    【Swift入门(一)——基本的语法】
    【Swift入门(二)——字符与字符串】
    【Swift入门(三)——元组(Tuple)】
    【Swift入门(四)——可选类型(Optionals)与断言(Assert)】
    【Swift入门(五)——数组(Array)】
    【Swift入门(六)——字典(Dictionary)】
    【Swift入门(七)——结构体(Struct)】
    【Swift入门(八)——功能强大的求余运算符】
    【Swift入门(九)——String与Int、Double、Float等数字相互转换】
    【Swift入门(十)——循环引用、弱引用和无主引用】
    【Swift入门(十一)——类型转换与is、as操作】
    【Swift入门(十二)——利用Extension加入逆序输出字符串方法】

  • 相关阅读:
    kafka的概念
    java的多线程:java安全问题产生的原因与JMM的关系
    java的多线程:线程安全问题
    web自动化之键盘操作
    获取cookie里面的sessionid
    Python连接mysql数据库
    Python 发送Email
    Python日志模块
    openxl模块从excel里面读取数据
    Python读取配置文件
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8456619.html
Copyright © 2011-2022 走看看