可选类型

可选类型的使用场合

当一个值可能存在,可能不存在的时候,就用可选类型
比如查找字符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的值不存在")

}

可选类型的价值

可选类型让开发人员可以在程序运行时,检测一个值是否存在
然后使用代码来分别处理存在和不存在的情况
选择绑定                                                                      
选择绑定的作用
用来确定一个可选类型(包装)的值是否存在
如果值存在,把该值赋给一个临时常量\变量
如果值不存在,就不创建任何临时常量\变量
选择绑定的概念
将可选类型(包装)的值有选择地赋给临时常量\变量
也可以称为“选择绑定解包”
选择绑定的使用场合
if\while语句
 
选择绑定的应用                                                            
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 ~ 无限大
如果没开通银行卡或者银行卡丢了,银行卡的余额就没有值,因为连卡都没有
 

Swift入门教程:基本语法(四)的更多相关文章

  1. Swift入门教程:基本语法大全

    原文:Swift入门教程:基本语法大全       简介:                                                                        ...

  2. Swift入门教程:基本语法(三)

    打印输出 Swift提供了2个打印输出函数 println :输出内容后会自动换行 print :对比println,少了个自动换行的功能 示例 输出字符串 println("欢迎学习传智播 ...

  3. Swift入门教程:基本语法(一)

          简介:                                                                                       什么是S ...

  4. Swift入门教程:基本语法(五)

    断言 断言是一种实时检测条件是否为true的方法 如果条件为true,那么代码继续执行 如果条件为false,就抛出错误信息,直接终止程序的运行   断言的用法 使用全局的assert函数 passe ...

  5. Swift入门教程:基本语法(二)

    数字格式 数字可以增加额外的格式,使它们更容易阅读 可以增加额外的零 0 let money = 001999           // 1999 let money2 = 001999.000   ...

  6. 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    http://blog.csdn.net/poem_qianmo/article/details/26977557 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...

  7. 《Visual C++ 2010入门教程》系列四:VC2010中初学者常见错误、警告和问题

    <Visual C++ 2010入门教程>系列四:VC2010中初学者常见错误.警告和问题   这一章将帮助大家解释一些常见的错误.警告和问题,帮助大家去理解和解决一些常见问题,并了解它的 ...

  8. ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一 ...

  9. D3.js的v5版本入门教程(第四章)—— 理解Update、Enter、Exit

    D3.js的v5版本入门教程(第四章) Update.Enter.Exit是D3.js中很重要的概念,下面来讲一下它们到底是什么?(当你看完后.你就会知道如果数据集个数和选择集个数不匹配的情况下使用d ...

随机推荐

  1. 1号店Interview小结

    三大范式: 为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范 ...

  2. DM8168 新三板系统启动

    DM8168从补丁到系统的新董事会开始折腾了20天,最终完成,高校是累的东西,导师只焊接机10一个BGA,其他人则手. 前段时间启动操作系统时,到了Starting Matrix GUI applic ...

  3. 将android界面背景设置为黑色

    屏幕背景设置为黑色的几种方式: 新建项目时候 第二次next之后(不同sdk版本号可能不同),Background Color项点击可选. 开公布局文件,选择视图查看 就是下边二个选项卡中的第一个(G ...

  4. android4.4组件分析--service组件-bindService源代码分析

    6.1.1.    bindService 由于有前面分析startService的代码实现过程,则对于bindService的代码分析就不用那么具体介绍,在介绍流程的同一时候更关注一些细节上的部分. ...

  5. PHP设计模式——备忘录模式

    声明:本系列博客參考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对 ...

  6. win8 metro 调用摄像头拍摄照片并将照片保存在对应的位置

    刚刚做过这类开发,所以就先献丑了,当然所贴上的源代码都是经过验证过的,已经执行成功了,希望能够给大家一些借鉴: 以下是metro UI代码: <Page x:Class="Camera ...

  7. 【白注意】Windows XP 大胆拥抱Linux在系统中所遇到的问题

    Windows XP至4月8日本将不再是微软官方技术支持.虽然仍可以继续使用,但他们大部分的风险.可一不留神被黑客攻击.似向下,Linux这也是一个不错的选择. 或许很多文章开始教你如何迁移,您,迁移 ...

  8. [INS-20802] Oracle Database Configuration Assistant 失败

    1.错误原因    [INS-20802] Oracle Database Configuration Assistant 失败 2.错误原因 3.解决方案 版权声明:本文博主原创文章.博客,未经同意 ...

  9. 中介模式和学习日记Effective C++

    中介模式(Mediator):利用中介对象来封装一组对象交互.中保使对象并不需要显式地相互引用,使得松耦合,的交互. (1).中介者模式非常easy在系统中应用,也非常easy在系统中误用.当系统出现 ...

  10. 《Linux Device Drivers》第十四章 Linux 设备型号

    基本介绍 2.6内核设备模型来提供的抽象叙述性描述的一般系统的结构,为了支持各种不同的任务 电源管理和系统关机 用户空间与通信 热插拔设备 设备类型 kobject.kset和子系统 kobject是 ...