zoukankan      html  css  js  c++  java
  • 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 ~ 无限大
    如果没开通银行卡或者银行卡丢了,银行卡的余额就没有值,因为连卡都没有
     
  • 相关阅读:
    VS2010 自动跳过代码现象
    Reverse Linked List II 【纠结逆序!!!】
    Intersection of Two Linked Lists
    Linked List Cycle II
    Remove Nth Node From End of List 【另一个技巧,指针的指针】
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Remove Duplicates from Sorted List
    Linked List Cycle
    Dungeon Game
  • 原文地址:https://www.cnblogs.com/myios/p/3782226.html
Copyright © 2011-2022 走看看