为什么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)相关推荐

  1. iOS开发笔记之九十四——Swift中的可选类型Optional

    一.Optional类型的概念 Swift中为何要引入Optional的概念,官方文档中有介绍: Swift also introduces optional types, which handle ...

  2. Swift中关于可选类型(?)与强制解析(!)的特性

    2019独角兽企业重金招聘Python工程师标准>>> Swift中问号表示这是一个可选类型,白话翻译:某个常量或者变量可能是一个类型,也可能什么都没有,我不确定它是否真的会有值,也 ...

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

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

  4. Swift——可选类型Optional

    Swift中有规定:对象中的任何属性在创建对象时,都必须有明确的初始化值. 注意:强制解包是非常危险操作,如果可选类型为nil,强制解包系统会崩溃 建议:在强制解包前,先对可选类型进行判断,判断是否n ...

  5. Swift之深入解析可选类型Optional的底层原理

    一.Optional 简介 Swift 的可选(Optional)类型,用于处理值缺失的情况,可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值". S ...

  6. Swift3.0可选类型(Optional)倾心总结

    本篇主要对Swift3.0版本的可选类型经常使用的场景及注意点加以总结,当做以后可以随时翻译的资料:因为本篇为自己编码时候的总结,难免会有遗漏,希望广大读者加以补充 Swift3.0 Optional ...

  7. Object-C---gt;Swift之(二)可选类型

    可选和nil的恋情 先看一个例子吧!let str="hello world"let num:Int=Int(str) 这两行代码的意思str字符串转换成Int类型,嘿嘿!这不是坑 ...

  8. 初探swift语言的学习笔记二(可选类型?和隐式可选类型!)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/28904115 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  9. swift可选隐式可选类型

    可选类型.隐式可选类型 在swift中,可选鲁迅个其实是一个,枚举类型,里面有None和Some两种类型.其实所谓的nil就是Optional.None,非nil就是Optional.Some,然后会 ...

最新文章

  1. HTML中的一些知识点
  2. CentOS6.5 升级 Python 2.7 版本
  3. 20220129---CTF刷题---WEB--代码审计
  4. 小程序picker标题_微信小程序-自定义picker选择器
  5. Jquery网页元素里面的操作以及JSON
  6. 3. Node.js REPL(交互式解释器)
  7. 根据pid查端口_PLC应用,3个PID控制实例讲解,想不会都难!
  8. 10010序列检测器的三段式状态机实现(verilog)
  9. 地磅15针到9针数据线连接串口数据采集方法
  10. 《当程序员的那些狗日日子》(二十三)死在了今天的晚上
  11. maven-replacer-plugin的使用
  12. mac pro M1(ARM)安装:centos8.0虚拟机
  13. 基于ASP.NET的电商系统的设计与实现
  14. 股票策略:A股三季度配置偏向成长股
  15. 【科普】你知道腾讯的技术职级吗?
  16. ShopXO开源电商系统源码支持PC+H5支付宝小程序微信小程序百度小程序头条amp;抖音小程序QQ小程序APP等
  17. 使用Netty实现一个小型服务器(作为数据中转站)
  18. 【刘润】读刘润老师公众号笔记
  19. Android数据库与ContentProvider
  20. WiFi信号覆盖面积小?如何扩大Wifi信号覆盖范围?

热门文章

  1. 启动服务提示-bash: mongod: command not found
  2. java 实现复制_在java中如何实现复制,粘贴,剪切
  3. 做了5年测试连一门语言都没学?逆袭后拿到3个超22K offer!
  4. 测试开发:聊一聊自动化测试框架,值得收藏!
  5. 匹配左括号或者右括号js_九章算法 | 蚂蚁金服面试题:有效的括号字符串
  6. keras如何在验证集加噪声_Keras从时域、频域处理音频分类问题(带详细注释)...
  7. 入门mysql执行计划
  8. python中模块文件的扩展名不一定是py_python模块和python包有什么区别?
  9. java 博客系统 tale_Java 博客系统 Tale
  10. 坡度土方计算案例_【攻略】如何解锁方格网法土方计算?