Swift-可选值(Optional)讲解
前提:Swift中有规定:对象中的任何属性在创建时,都必须要有明确的初始化值
1.定义可选类型
方式一:常规方式(不常用)
var name : Optional<String> = nil
方式二:语法糖(常用)
var name:String? = nil
Optional理解:
Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil。此外,Swift的nil也和Objective-C有些不一样,在Objective-C中,只有对象才能为nil,而在Swift里,当基础类型(整形、浮点、布尔等)没有值时,也是nil,而不是一个初始值,没有初始值的值,是不能使用的,这就产生了Optional类型。定义一个Optional的值很容易,只需要在类型后面加上问号(?)就行了:
let nameStr: String?
Optional值和非Optional值的区别就在于:Optional值未经初始化时也为nil,非Optional未初始化时什么都没有,如果直接使用会报错:
//未被初始化,但是是一个Optional类型,为nil
var nameStr: String?
str //输出nil
//未被初始化,也不是Optional类型
var nameStr2: String
str2 //使用时出错
Optional拆包:
Optional类型的值不能被直接使用,当需要用时要显式拆包,以表明我知道这个Optional是一定有值的:拆包的方式是直接在变量后加!
var nameStr: String? = "Hello World!"
nameStr //{Some "Hello World!"}
nameStr! //Hello World!
拆包的原因是因为Optional类型其实是一个枚举:
enum Optional<T> : Reflectable, NilLiteralConvertible {
case None
case Some(T)
init()
init(_ some: T)
/// Haskell's fmap, which was mis-named
func map<U>(f: (T) -> U) -> U?
func getMirror() -> MirrorType
static func convertFromNilLiteral() -> T?
}
拆包的作用就是将值取出来。
隐式拆包:
除了显式拆包,Optional还提供了隐式拆包,通过在声明时的数据类型后面加一个感叹号(!)来实现:
var nameStr: String! = "Hello World!"
nameStr //Hello World!
可以看到没有使用(?)进行显式的折包也得到了Some中的值,这个语法相当于告诉编译器:在我们使用Optional值前,这个Optional值就会被初始化,并且总是会有值,所以当我们使用时,编译器就帮我做了一次拆包。如果你确信你的变量能保证被正确初始化,那就可以这么做,否则还是不要尝试为好。
Optional Binding
var count: Int?
count = 100
if count != nil {
"count is " + String(count!) //count is 100
} else {
"nil"
}
上面代码,如果判断为真,下面将进行拆包,为了避免在条件判断语句后执行一次或更多次的拆包,Swift引进了Optional Binding,我们就可以这样做
var count: Int?
count = 100
if let validCount = count {
"count is " + String(validCount) //count is 100
} else {
"nil"
}
通过在条件判断语句中(如if、while等)把Optional值直接给一个临时常量,Swift会自动检测Optional是否包含值,如果包含值,会隐式的拆包并给那个临时常量,在接下来的上下文中就能直接使用这个临时常量了
注意:强制解包是危险操作,容易导致程序崩溃
建议在强制解包前,先对可选类型进行判断,判断是否为nil
可选绑定
写法一:(不常用)因为每次解包要创建一个新的变量
if let tempName = name{
print(tempName)
}
解释:1.判断name是否有值,如果没有不执行{}内容,如果有值,系统会自动将name解包,并且直接复制给tempName
写法二:(常用),就近原则
if let name = name{
print(name)
}
Swift-可选值(Optional)讲解的更多相关文章
- Swift 可选值(Optional Values)介绍
Optional的定义 Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil.此 ...
- swift的可选值(optional)
苹果那文档写了一大堆也没有好好的写一下可选值(optional)这个东西.就是在有一个“Optional Chaining”的章节,但是也不是很充分的说明.最后找了半天在“the basics”里墨迹 ...
- swift可选值总结
1.枚举结构: 2.装包.解包概念:关联值. 3.可选值声明: 4.解包: 5.可选值作为参量生成的链. 6.可选值调用链. 最后做个总结 访问可选对象的属性或方法时,可以用 ? 号 访问可选对象的属 ...
- Swift可选类型(Optional)之星耀
首先我们先看下Objective-C与Swift语言对于可选nil的不同理解: Objective-C中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体.枚举等类型不起作用(会返回N ...
- 2. Swift元组|可选值|断言
1. 元组英文名字 Tuple,将多个数据类型(任意类型)组合成一个数据,与c语言的中的机构体有几分相似,功能也是非常强大的,尤其是在定义请求参数,状态之类的地方经常用到. let http404Er ...
- Swift学习笔记(2)--元组(Tuples)、Optional(可选值)、(Assertions)断言
1.Tuples(元组) 元组是多个值组合而成的复合值.元组中的值可以是任意类型,而且每一个元素的类型可以是不同的. 1>定义:使用()包含所有元素,用逗号分开,也可以对每个元素做命名 let ...
- 窥探Swift之新添数据类型元组与可选值
今天的博客中就总结一下关于Swift中相对Objc新添加的两个数据类型:元组(Tuple)和可选值类型(Optional).上面这两个类型是Swift独有的类型,使用起来也是非常方便的,今天就通过一些 ...
- Swift中的Optional类型 (可选类型)与强制解包 ? !
我们在swift的开发中会经常遇见?和! ,理解这两个符号深层次的内容对我们的开发是相当有利的: 目前网上对swift3.0的教程还相当的少,如果去搜索会发现早期的说法,在定义变量的时候,swift是 ...
- Swift语言指南(六)--可选值
原文:Swift语言指南(六)--可选值 在值可能不存在的情况下使用可选值(optional), 可选值是: · 存在一个值,这个值等于 x 或 · 不存在任何值 注: 在 C 和 Objective ...
随机推荐
- 端午节佳节从CSDN博客搬家来这,请多多指教
端午节佳节从CSDN博客搬家来博客园,请多多指教
- 谈谈php对象的依赖
通过构造函数的方法 <?php //定义一个类,后面的类依赖这个类里面的方法 class play { public function playing() { echo "I can ...
- SST-超级简单任务调度器结构分析
SST(Super Simple Task) 是一个基于任务优先级.抢占式.事件驱动.RTC.单堆栈的超级简单任务调度器,它基于Rober Ward一篇论文的思想,Miro Samek用C重新编程实现 ...
- 分治与递归-找k个临近中位数的数
问题描述:给定由n个互不相同的数组成的集合S以及正整数k≤n,试设计一个O(n)时间算法找出S中最接近S的中位数的k个数. 算法描述: 用线性时间选择实现的算法找到中位数 S’=除去中位数外的S S& ...
- python类的封装
Python之类的封装 1. 什么是封装 装:往容器/名称空间里存入名字 封:代表将存放于名称空间中的名字给藏起来,这种隐藏对外不对内(怎么做到的,在下文解释) 2. 为何要封装 封数据属性:不想要给 ...
- 【8086汇编-Day5】第三次实验
练习一 结果展示: 这个程序执行下来貌似打印了数字36,但其实是两个数字3.6: 这段就是用来打印3:首先ah里放2,跟后面的int 21h结合起来就是调用21号中断例程的2号子程序,用来打印到标准输 ...
- Linux怎样创建FTP服务器--修改用户默认目录-完美解决 - 费元星
在创建FTP服务器之有先命令: ps -ef |grep vsftpd 查一下系统有没有安装vsftpd这个服务器,如果出现如下图所示的界面说明没有安装. 然后再执行:yum install vs ...
- YUM本地源制作与yum网络版仓库
1.修改本机上的YUM源配置文件,将源指向自己 cd /etc/yum.repos.d/ 备份原有的YUM源的配置文件 rename .repo .repo.bak * rename CentOS-M ...
- Kotlin Android Extensions: 与 findViewById 说再见 (KAD 04) -- 更新版
作者:Antonio Leiva 时间:Aug 16, 2017 原文链接:https://antonioleiva.com/kotlin-android-extensions/ 在 Kotlin1. ...
- (Pyhton爬虫03)爬虫初识
原本的想法是这样的:博客整理知识学习的同时,也记录点心情...集中式学习就没这么多好记录的了! 要学习一门技术,首先要简单认识一下爬虫!其实可以参考爬虫第一章! 整体上介绍该技术包含技能,具体能做什么 ...