可选类型

《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("转换成功")
  4. }

不过每次使用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时使用“!”

[swift]可选类型的更多相关文章

  1. swift 可选类型笔记

    晚上十一点半了,看书累了,原本想睡了的,想了想,还是把刚看的总结一下,把这篇笔记写了吧.广州下雨,真特么的冷..好了,废话不说了,说正题说说Swift可选类型. 先定义一个变量: var string ...

  2. Swift 可选类型-备

    我们先看看如下代码: var n1: Int = 10 n1 = nil         //编译错误 let str: String = nil    //编译错误 Int和String类型不能接受 ...

  3. Swift - 可选类型说明

    可选类型是Swift的一个特色.它表示一个变量有可能有值,也可能没有值(nil). 声明的方式是“数据类型+问号”. 而当要使用一个可选类型的变量是,要在后面加感叹号“!”. 1 2 3 4 5 6 ...

  4. swift 可选类型(optional)

    可选类型定义 Swift 标准库中定义后缀  ?为可选类型 Optional<Wrapped> 的语法糖,这里语法糖可以简单理解为一种便捷的书写语法.也就是说,下面两个声明是等价的: va ...

  5. Swift - 可选类型详解

    可选类型详解 直接上代码解释 // 类中所有的属性在对象初始化时,必须有初始化值 class Person : NSObject { var name : String? var view : UIV ...

  6. iOS:swift :可选类型

    import UIKit /*: 可选类型 * 可选类型表示变量可以有值, 也可以没有值 * C 和 Objective-C 中并没有可选类型这个概念 * Swift中只有可选类型才可以赋值为nil ...

  7. Swift可选类型(Optional)之星耀

    首先我们先看下Objective-C与Swift语言对于可选nil的不同理解: Objective-C中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体.枚举等类型不起作用(会返回N ...

  8. Swift可选类型

    可选类型 可选类型的介绍 注意: 可选类型时swift中较理解的一个知识点 暂时先了解,多利用Xcode的提示来使用 随着学习的深入,慢慢理解其中的原理和好处 概念: 在OC开发中,如果一个变量暂停不 ...

  9. swift 可选类型(optional)--- swift 入门

    一.思维导图 二.代码 //这样无形中就会让代码很丑陋 if x != nil && y != nil { print("x或y都不等于空") } print(&q ...

随机推荐

  1. Java解惑五:类之谜

    本文是依据JAVA解惑这本书,做的笔记.电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题46 函数重载的问题. JAVA重载解析过程 ...

  2. SensorThread线程

    SensorThread  && createEventQueue http://www.csdn.com/html/itweb/20131101/200375.htm_123 htt ...

  3. Android View.onMeasure方法的理解(转载)

    一下内容转载自http://blog.sina.com.cn/s/blog_61fbf8d10100zzoy.html View在屏幕上显示出来要先经过measure(计算)和layout(布局).1 ...

  4. springMVC项目引入jstl标签库若干问题的总结

    中午,不知道动到项目的哪个地方了,之前在联系人列表页面用的好好的jstl标签库突然报错了:<%@taglib prefix="c" uri="http://java ...

  5. 深入理解Linux操作系统守护进程的意义

    Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daemons)来执行的.守护进程 ...

  6. 有关Color和Drawable你所不知道的那些内容

    Android开发中,我们经常会用到Color或Drawable,有时他们是可以混用的,有时却有严格的区别. Drawable 体系结构 Drawable是可绘制物件的一般抽象.与View不同,Dra ...

  7. selendroid项目实战教程1

    selendroid是国内使用非常少的框架.资料也少.刚好公司项目用到,给大家分享下,技术不太行,有错误还望指正. 使用selendroid契机,是公司开发的APP,需要大量捕捉Toast信息.公司的 ...

  8. keystone系列二:keystone源码分析

    六 keystone架构 6.1 Keystone API Keystone API与Openstack其他服务的API类似,也是基于ReSTFul HTTP实现的. Keystone API划分为A ...

  9. magento 产品列表排序、分页功能

    我们以 catalog_category_layered 控制器为例说明 在catalog.xml 找到catalog_category_layered配置段 <catalog_category ...

  10. 解读Spring Ioc容器设计图

    在Spring Ioc容器的设计中,有俩个主要的容器系列:一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器最基本的功能:另外一个是ApplicationContext应用上下 ...