zoukankan      html  css  js  c++  java
  • [swift]可选类型

     可选类型 

    《Swift权威指南》第2章千里之行始于足下——Swift语言基础,本章挑选了Swift语言的最基本特性加以介绍。尽管这些特性只占Swift全部特性的很少一部分,但却是所有的Swift程序都必不可少的。所以,读者通过对本章学习,可以使用Swift编写最基本的程序,并对Swift提供的新特性深深地震撼。本节为大家介绍可选类型。

    AD:

    2.6  可选类型

    可选类型也是Swift语言新添加的对象。主要是为了解决对象变量或常量为空的情况。在前面定义的变量和常量都不能为空。里面必须要有值。

    Swift中的可选类型则允许变量(常量)中没有值(被设为nil)。要注意的是,Swift中的nil和Objective-C中的nil不一样。前者的nil表示没有值,而后者的nil表示变量值为空。

    可选类型需要在类型后面加一个问号(?)。一个典型的例子是String类有一个toInt方法,该方法会将字符串转换为Int类型。不过这里就有一个问题,字符串中可能包含非数字的字符,这时就会转换失败。如果在其他语言中,不添加错误捕捉,可能会抛出异常,而在Swift中,如果转换失败,就直接返回nil。表示没有返回Int类型的值(反正你想加捕捉异常做不到,因为Swift中压根就没有异常捕捉)。这里的toInt方法返回的就是一个可选类型。

    下面的代码将numStr中的值转换为Int类型的值,并输出该值。
     

    1. var numStr:String = "123" 
    2. var value:Int? = numStr.toInt();  //  value必须定义为可选的Int类型,否则无法成功编译  
    3. println(value) 

    如果将123改成会导致转换失败的值,如a123,那么执行上面的代码后就会输出nil了。

    对于一个可选类型的变量或常量,通常在使用之前需要进行判断,例如,下面的代码会对value进行判断,如果确实转换成功(不为nil),则输出一行文本。
     

    1. if value != nil  
    2. {  
    3.     println("转换成功")  

    不过每次使用value变量时都进行判断很麻烦,所以,Swift添加了一个用于确定可选类型变量一定有值的感叹号(!)。当对value第一次判断后,如果能确认该变量已经被赋了值,后面就可以直接在value后加感叹号使用该变量了。
     

    1. println(value!) 

    如果在可选类型变量(常量)后面加感叹号,当变量(常量)为nil时,程序会中断,并在终端输出如下的信息。
     

    1. fatal error: unexpectedly found nil while unwrapping an Optional value 

    所以在可选变量(常量)后面加感叹号时,要确保该变量(常量)中一定有值。

    现在已经知道了,在引用可选类型变量(常量)时,后面加感叹号是为了在该变量(常量)中没有值(为nil)时抛出运行时异常。那么每次都加感叹号也挺麻烦,所以干脆在定义可选类型变量(常量)时将问号改成感叹号,这样就可以直接引用这些可选类型变量和常量了。
     

    1. var numStr:String = "123" 
    2. var value:Int! = numStr.toInt();  //  value必须定义为可选的Int类型,否则无法成功编译  
    3. //  即使value后面不加!(当然,加!也没问题),当value为nil时以后抛出异常  
    4. println(value) 

    注意 在使用可选类型变量(常量)时,如果使用问号(?)来定义,并且单独使用这些变量和常量,后面是可以不加感叹号(!)的。但要让这些变量和常量和其他的值通过操作符进行操作,那就必须要加感叹号了。如下面的代码是合法的。
     

    1. var numStr:String = "123" 
    2. var value:Int! = numStr.toInt();  
    3. println(value)    //  如果value为nil,则会输出nil 

    但下面的代码就无法成功编译了。

    1. var numStr:String = "123" 
    2. var value:Int! = numStr.toInt();  
    3. println(value + 4)//  编译失败,value必须写成value!,或在定义value时使用“!” 
  • 相关阅读:
    阿里云安装Kafka并配置外网访问
    Golang之select中time.After()为什么不生效
    macOS配置GitHub和GitLab共存
    Golang获取HTTP请求IP
    macOS下安装Python3.8并设置为默认版本
    mysql之力扣数据库题目620有趣的电影优化记录
    Pgsql之查询一个月份的天数
    Pgsql之查询一段时间内的所有年月yyyy-mm
    Pgsql之查询一段时间内的所有日期
    swiper下echarts点击事件失效
  • 原文地址:https://www.cnblogs.com/nonato/p/4875119.html
Copyright © 2011-2022 走看看