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 ...
随机推荐
- R语言进行词云统计分析
R语言进行词云统计分析 本文章从爬虫.词频统计.可视化三个方面讲述了R语言的具体应用,欢迎大家共同谈论学习 1.使用 rvest 进行数据的爬取 #如果没有,先安装rvest包 install.pac ...
- 用matplotlib库画图
1.用例一 import matplotlib.pyplot as plt import numpy as np x=np.linspace(0,10,100) y=np.cos(2*np.pi*x) ...
- eval函数的作用
eval函数的作用是去掉字符串最外侧的引号,并按照Python的语法执行去掉引号后的字符内容. [实例1] x=eval("12+36")print(x) #结果为48此例中,去 ...
- burp实时获取token
在一些web网站里 会加入token来限制用户的一些操作 如果用户的请求里面没有这个token 那么我们的一些操作就会很麻烦 现在 我来演示一下burp如何自动更新token 首先 需要dvwa ...
- 小程序开发-9-Behavior行为与加入缓存系统优化流行页面
Behavior行为与加入缓存系统优化流行页面 navi组件与移动端触碰区域探讨 触碰区域优化 设计师切图切大点,多余部分变成透明色 前端将可触碰区域变大 解决向左箭头变灰,向右变灰 禁用事件的技巧 ...
- bedtools-Documentation
https://media.readthedocs.org/pdf/bedtools/latest/bedtools.pdf
- java入门---对象和类&概念详解&实例
Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 这篇文章,我们主要来看下: 对象:对象是类的一个实例(对象不是找个女朋友),有状态 ...
- 全国Uber优步司机奖励政策 (1月11日-1月17日)
本周已经公开奖励整的城市有:北 京.成 都.重 庆.上 海.深 圳.长 沙.佛 山.广 州.苏 州.杭 州.南 京.宁 波.青 岛.天 津.西 安.武 汉.厦 门,可按CTRL+F,搜城市名快速查找. ...
- 4245: [ONTAK2015]OR-XOR
4245: [ONTAK2015]OR-XOR https://www.lydsy.com/JudgeOnline/problem.php?id=4245 /* 要求分成m份,总价值为a1|a2|a3 ...
- Linux命令应用大词典-第24章 任务计划
24.1 contab:针对个人用户维护crontab文件