Swift中的可选类型(Optional)
为什么80%的码农都做不了架构师?>>>
Swift中的可选类型(Optional)
##什么是Optional
Optional在Swift中表示可选类型,那么什么是可选类型?
我们都知道,在Swift中,属性的值都是不能为nil
的,但是在正常情况下你不可能一开始就确定所有属性的值,又或者你根据条件查询数据,你要返回这条数据,但假如没有符合条件的数据,那该怎么办?
这时就可以使用可选类型,在Swift中,你想要让一个属性的值为nil
,你必须使用Optional(可选类型),Optional其实是一个泛型enum(枚举),里面包含两种情况,一种是没有值,即nil
,另外种是有值,就是你原类型的值,伪代码如下:
enum Optional<T> {case Nonecase Some(T)
}
至于为什么enum可以这么写?跟其他语言中的enum不一样?这个后面有空会专门写一篇。
那么要怎样使用Optional呢?其实很简单,只需要在定义属性时,在后面跟个?
或者!
即可,代码如下:
var str:String?
println(str)
这段代码会输出nil
##Optional后面的?
跟!
是什么意思?
对于类型而言,他们没有任何区别,都是表示一个Optional类型,他们的区别只是语法上的。
?
表示该属性是一个不确定值的属性,即该属性的值有可能为空 !
表示该属性有值,解包当做原类型来使用,但如果该属性没有值时(即nil
),会导致异常
###什么时候该用!
?
在你定义个一个属性,并且该属性的值在正常情况下不会为nil
时,你应该直接在属性定义时使用!
解包,方便后续使用,例如:
/*由于这个属性与storyboard中的UILabel关联了所以在初始化UI的时候就会自动初始化这个属性,并赋值也就是说这个属性默认情况下有值,且后续操作中都有值(假如你不设置为nil的话)所以这里应该使用!来解包,以简化后续操作*/@IBOutlet var label: UILabel!override func viewDidLoad() {super.viewDidLoad()//因为属性在定义时已经解包,所以这里直接当做原类型使用,即UILabel类型label.text = "hello"}
如果将!
改成?
的话,就会出现下图的错误,提示你未解包,因为?
表示这个属性值不确定,即有可能为nil
,如果是nil
,那肯定不能操作,所以会要求你进行解包,那你就需要在每次操作label属性时加上!
进行解包,就显得很麻烦
###什么时候该用?
?
在你定义一个属性,并且该属性的值在正常情况下可能为nil
时,你应该在定义属性时使用?
比如你要从数据库中获取一条记录,但该记录可能不存在,在后续的操作中,由于该属性是?
(不确定值的属性),你在使用时必须要进行解包,这会提醒你该属性可能为nil
,你需要判断他是否为nil
,在进行相应的操作,以提高程序的健壮性
在没查询到结果的情况下:
在查询到结果情况下:
假如你在属性定义时使用了!
,那么在后续操作中将不会提示你进行解包,你有可能会忘记该属性在正常情况下也会为nil
,你直接把它拿来使用将会抛出异常。
##总结
在Swift中Optional表示可选类型,可选类型的值可以为nil
在类型后面加上?
或者!
即表示可选类型
如果一个属性在正常情况下可能为nil
,那最好用?
,这会在你使用时提示你需要解包,你就可以使用if解包并判断其是否为nil
,能提升程序健壮性
如果一个属性在正常情况下不会为nil
,那最好用!
,可以方便后续操作
不确定值(?
) -> 确定值(!
)
var name:String?
name = "Peter"
println(name!)
本文转自本人独立博客,更多文章请访问 -> Yenn的杂物间
转载于:https://my.oschina.net/u/865431/blog/498560
Swift中的可选类型(Optional)相关推荐
- iOS开发笔记之九十四——Swift中的可选类型Optional
一.Optional类型的概念 Swift中为何要引入Optional的概念,官方文档中有介绍: Swift also introduces optional types, which handle ...
- Swift中关于可选类型(?)与强制解析(!)的特性
2019独角兽企业重金招聘Python工程师标准>>> Swift中问号表示这是一个可选类型,白话翻译:某个常量或者变量可能是一个类型,也可能什么都没有,我不确定它是否真的会有值,也 ...
- Swift可选类型(Optional)之星耀
首先我们先看下Objective-C与Swift语言对于可选nil的不同理解: Objective-C中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体.枚举等类型不起作用(会返回N ...
- Swift——可选类型Optional
Swift中有规定:对象中的任何属性在创建对象时,都必须有明确的初始化值. 注意:强制解包是非常危险操作,如果可选类型为nil,强制解包系统会崩溃 建议:在强制解包前,先对可选类型进行判断,判断是否n ...
- Swift之深入解析可选类型Optional的底层原理
一.Optional 简介 Swift 的可选(Optional)类型,用于处理值缺失的情况,可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值". S ...
- Swift3.0可选类型(Optional)倾心总结
本篇主要对Swift3.0版本的可选类型经常使用的场景及注意点加以总结,当做以后可以随时翻译的资料:因为本篇为自己编码时候的总结,难免会有遗漏,希望广大读者加以补充 Swift3.0 Optional ...
- Object-C---gt;Swift之(二)可选类型
可选和nil的恋情 先看一个例子吧!let str="hello world"let num:Int=Int(str) 这两行代码的意思str字符串转换成Int类型,嘿嘿!这不是坑 ...
- 初探swift语言的学习笔记二(可选类型?和隐式可选类型!)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/28904115 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...
- swift可选隐式可选类型
可选类型.隐式可选类型 在swift中,可选鲁迅个其实是一个,枚举类型,里面有None和Some两种类型.其实所谓的nil就是Optional.None,非nil就是Optional.Some,然后会 ...
最新文章
- HTML中的一些知识点
- CentOS6.5 升级 Python 2.7 版本
- 20220129---CTF刷题---WEB--代码审计
- 小程序picker标题_微信小程序-自定义picker选择器
- Jquery网页元素里面的操作以及JSON
- 3. Node.js REPL(交互式解释器)
- 根据pid查端口_PLC应用,3个PID控制实例讲解,想不会都难!
- 10010序列检测器的三段式状态机实现(verilog)
- 地磅15针到9针数据线连接串口数据采集方法
- 《当程序员的那些狗日日子》(二十三)死在了今天的晚上
- maven-replacer-plugin的使用
- mac pro M1(ARM)安装:centos8.0虚拟机
- 基于ASP.NET的电商系统的设计与实现
- 股票策略:A股三季度配置偏向成长股
- 【科普】你知道腾讯的技术职级吗?
- ShopXO开源电商系统源码支持PC+H5支付宝小程序微信小程序百度小程序头条amp;抖音小程序QQ小程序APP等
- 使用Netty实现一个小型服务器(作为数据中转站)
- 【刘润】读刘润老师公众号笔记
- Android数据库与ContentProvider
- WiFi信号覆盖面积小?如何扩大Wifi信号覆盖范围?
热门文章
- 启动服务提示-bash: mongod: command not found
- java 实现复制_在java中如何实现复制,粘贴,剪切
- 做了5年测试连一门语言都没学?逆袭后拿到3个超22K offer!
- 测试开发:聊一聊自动化测试框架,值得收藏!
- 匹配左括号或者右括号js_九章算法 | 蚂蚁金服面试题:有效的括号字符串
- keras如何在验证集加噪声_Keras从时域、频域处理音频分类问题(带详细注释)...
- 入门mysql执行计划
- python中模块文件的扩展名不一定是py_python模块和python包有什么区别?
- java 博客系统 tale_Java 博客系统 Tale
- 坡度土方计算案例_【攻略】如何解锁方格网法土方计算?