• Swift入门教程:基本语法(四)


         可选类型                                                                                    

    可选类型的使用场合                                    

    当一个值可能存在,可能不存在的时候,就用可选类型
    比如查找字符k在某个字符串中的位置
    如果字符串是"jake",说明k的位置存在,是2
    如果字符串是"kate",说明k的位置存在,是0
    如果字符串是"itcast",说明k的位置不存在
    那么k的位置就应该用可选类型
     
    可选类型的格式:类型名?

    var kIndex : Int?

    问号?表明kIndex的值是可选的,可能是一个Int,也可能值不存在
    kIndex的值要么是Int类型,要么是nil(nil代表值不存在)
    kIndex默认就是nil,因此上面的语句相当于

    var kIndex : Int? = nil

    可选类型的应用                                            

    String有个toInt方法,可以将字符串转为对应的整数
    有些字符串能转成整数,比如"156",可以返回156
    有些字符串不能转成整数,比如"itcast",无法返回整数
    因此toInt方法的返回值是一个可选的Int类型(即Int?)
    字符串能转成整数,比如"156",就返回156
    字符串不能转成整数,比如"itcast",说明返回的整数值不存在,是nil

    let num = "156".toInt() // 156

    let num2 = "itcast".toInt() // nil

    注意:num和num2都是Int?类型,不是Int类型

    可选类型的本质                                              

    nInt?其实是对Int的一层包装,它们是2种不同的数据类型

    var num : Int? = 10

    // 上面代码是将Int类型的10,包装成了Int?类型的数据

    可选类型的注意点                                       
    注意
    不能直接将可选类型赋值给具体类型
    比如不能将Int?类型直接赋值给Int类型,原因如下
    Int?是对Int的一层包装,它们是2种不同的数据类型
    Int?都不确定有没有整数值
    下面的写法是错误的

    var num : Int? = 10

    var numValue : Int = num // 这行会报错

    相反,可以直接将Int类型赋值给Int?类型

    下面的写法是正确的

    var numValue : Int = 20

    var num : Int? = numValue // 自动将Int包装成Int?

    强制解包                                                    
    在可选类型的后面加个感叹号!,就可以把可选类型(包装)的值取出来,赋值给具体类型
    下面的写法是正确的

    var num : Int? = 10

    var numValue : Int = num!

    // 将num中(包装)的值取出来,赋值给numValue

    感叹号!相当于告诉编译器:我确定可选类型里面有值,可以将值取出来了

    基本概念

    解包:将可选类型(包装)的值取出来
    强制解包:使用感叹号!将可选类型(包装)的值取出来
    也有翻译为“拆包”
    注意
    如果可选类型(包装)的值不存在,仍然进行强制解包,会报一个错误

    fatal error: Can't unwrap Optional.None

    下面的代码是错误的

    var num : Int?

    var numValue = num! // 这行会报错

    因此:在进行强制解包之前,一定要先检测可选类型(包装)的值是否存在

     可选类型和if                                                               

    可以使用if语句来检测一个可选类型(包装)的值是否存在
    如果值存在,就返回true
    如果值不存在,就返回false

    let num = "156".toInt()

    if num {

        println("num的值是(num!)")

    } else {

        println("num的值不存在")

    }

    可选类型的价值

    可选类型让开发人员可以在程序运行时,检测一个值是否存在
    然后使用代码来分别处理存在和不存在的情况
    选择绑定                                                                      
    选择绑定的作用
    用来确定一个可选类型(包装)的值是否存在
    如果值存在,把该值赋给一个临时常量变量
    如果值不存在,就不创建任何临时常量变量
    选择绑定的概念
    将可选类型(包装)的值有选择地赋给临时常量变量
    也可以称为“选择绑定解包”
    选择绑定的使用场合
    ifwhile语句
     
    选择绑定的应用                                                            
    1.if let num = "156".toInt() {
    2.    println("num的值存在,是(num)")
    3.} else {
    4.    println("num的值不存在")
    5.}
    如果"156".toInt()的值存在
    就把值赋给临时常量num,执行第1 ~ 3行的大括号之间的代码
    如果"156".toInt()的值不存在
    就不创建临时常量num,执行第3 ~ 5行的大括号之间的代码
    注意
    这里的num是Int类型,不是Int?类型
    num的作用域是第1~3行的大括号之间,不能用在第3~5行的大括号之间
    也可以用临时变量来存储

    if var num = "156".toInt() {

    } else { }

     

    隐式解包                                                                 

    默认情况下:如果想将可选类型(包装)的值赋给具体类型,比如将Int?的值赋给Int类型,需要使用感叹号!进行强制解包

    var num : Int? = 10

    var numValue : Int = num!

    被声明为隐式解包的可选类型
    不用进行强制解包
    能够自动解包:自动把可选类型(包装)的值取出来赋给具体类型
     
    如何声明一个隐式解包的可选类型
    将 问号? 改为 感叹号! 即可

    var num : Int! = 20

    var numValue : Int = num      // 自动解包,不用再使用 ! 进行强制解包

    // num是被声明为隐式解包的可选类型Int!

    隐式解包的原理和应用                                                

    隐式解包的原理
    相当于告诉编译器:这个可选类型的值一直都存在,绝对能取出里面的值
    所以取值时不用手动加感叹号!,编译器会自动加上一个感叹号!
    于是就完成了“自动解包”
     
    隐式解包的应用
    如果某个常量变量的值,在有些情况下一定存在,就可以用隐式解包
    比如银行卡的余额就可以声明为隐式解包的可选类型
    只要开通了银行卡,银行卡的余额肯定有值,从0 ~ 无限大
    如果没开通银行卡或者银行卡丢了,银行卡的余额就没有值,因为连卡都没有
     
  • 相关阅读:
    最好的云备份选项
    不要让你的云备份策略退居次位
    了解区域类型
    Managing WMI security
    创建、导入、导出、复制以及粘贴 WMI 筛选器
    Gpfixup
    centos 7 安装MySQL 5.7.23
    centos 7 配置 mysql 5.7 主从复制
    oracle DG搭建
    undo表空间丢失、损坏
  • 原文地址:https://www.cnblogs.com/myios/p/3782226.html
Copyright © 2020-2023  润新知