Swift - 可选类型详解
可选类型详解
直接上代码解释
// 类中所有的属性在对象初始化时,必须有初始化值
class Person : NSObject {
var name : String?
var view : UIView?
var age : String?
} // 1.定义可选类型
// 1>普通定义可选类型的方式
var name : Optional<String>
// 2>语法糖 //这样写默认为空
var name : String? // 2.给可选类型赋值
name = "why" // 3.从可选类型中取值
print(name) // Optional("why")
// 从可选类型中取值:可选类型!-->强制解包
//print(name!) // 4.注意:如果可选类型中没有值,那么强制解包程序会崩溃
// 强制解包是非常危险的操作:建议在解包前先判断可选类型中是否有值
if name != nil {
print(name!)
print(name!)
print(name!)
}
"?" 这个简单意思,你的变量可能为nil,或者你可能将nil赋值给它,需要给变量定义的时候加上"?",否则一旦你将nil赋值给没有加"?"的变量,编译就会报错
举个例子理解一下,我们假如有一个盒子,盒子是一个存在的物体,swift不允许有空值出现,那我们怎么办呢?就需要把空值装到一个盒子里面,系统检查的时候,发现有一个盒子,哦,好的,检测通过,但是如果你把盒子打开系统就会报错
打印name 输出
Optional("why")
发现有个Optional 就说明这个变量被包着,那么怎么才能不让它包裹着呢? 很简单, 给变量加一个"!"
print(name!) //输出 why
我们还有一种解包的方式
let nickName: String? = nil
let fullName: String = "XUJIE"
let name = nickName ?? fullName //如果第一个解包值发现为nil,则使用第二值
print(name)
?? 的使用还有一个注意点
先看下面的例子
let a:Int! =
let b =
// 如果a不为nil则对a进行解包,赋值将b的值付给c
let c = a != nil ? a! : b
//??的用法相当于上面
let c = a ?? b // 如果a为nil则使用b的值替换a的值,如果a不为nil,则对a解包然后将值付给b
再看一个例子
let a:Int??? =
let b =
let c = a ?? b // 分析对a进行一次解包,得到的值不为nil,所以把解包后的值付给c
print(a)
print(c)
运行结果:
Optional(Optional(Optional()))
Optional(Optional())
再看一个例子(问题来了哦)
let a:Int??? = nil
let b =
let c = a ?? b
print(a)
print(c)
有些人已经猜到答案 nil 4 但我告诉你答案不是这样的,先来分析一下
首先a,有三个包Optional(Optional(Optional(nil))),当我们解掉第一次包后,发现值为nil,此时,我们需要将b的值替换给a,Optional(Optional())
所以我们的最终显示结果为:
nil
Optional(Optional())
可选绑定(判断可选类型中是否有值)
let urlString = "http://www.520it.com"
let url : URL? = URL(string: urlString) // 1.普通写法
if url != nil {
let request = URLRequest(url: url! )
} // 可选绑定
if let url = url {
let request = URLRequest(url: url)
} // 可选绑定的简介写法
if let url = URL(string: urlString) {
let request = NSURLRequest(url: url)
}
Swift - 可选类型详解的更多相关文章
- C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)
前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...
- C++11 并发指南六( <atomic> 类型详解二 std::atomic )
C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍) 一文介绍了 C++11 中最简单的原子类型 std::atomic_flag,但是 std::atomic_flag ...
- (转)MySQL字段类型详解
MySQL字段类型详解 原文:http://www.cnblogs.com/100thMountain/p/4692842.html MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间 ...
- C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解 ...
- C++11 并发指南六(atomic 类型详解三 std::atomic (续))
C++11 并发指南六( <atomic> 类型详解二 std::atomic ) 介绍了基本的原子类型 std::atomic 的用法,本节我会给大家介绍C++11 标准库中的 std: ...
- 服务启动项 Start类型详解
注册表的服务启动项 Start类型详解 HKLM\SYSTEM\CurrentControlSet\services\ 下的服务项.不论有没有在services.msc服务管理控制台中显示,在注册表中 ...
- swift 可选类型笔记
晚上十一点半了,看书累了,原本想睡了的,想了想,还是把刚看的总结一下,把这篇笔记写了吧.广州下雨,真特么的冷..好了,废话不说了,说正题说说Swift可选类型. 先定义一个变量: var string ...
- c# WebApi之接口返回类型详解
c# WebApi之接口返回类型详解 https://blog.csdn.net/lwpoor123/article/details/78644998
- C++之string类型详解
C++之string类型详解 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个泛型类出现,他集成的操作函 ...
随机推荐
- 根据URL获取参数值得出json结果集,对外给一个接口让别人调用
背景:测试接口的时候,经常都是后端get\post请求直接返回json结果集,很想知道实现方式,虽然心中也大概了解如何实现,但还不如自己来一遍踏实! 先来看一下结果吧: 以下对一个web的get接口进 ...
- Mac eclipse 编译、调试c++ 程序
可以先安装个CDT插件: eclipse菜单 -> Help -> Install New Software... -> Work with (Add..) Name:CDT Loc ...
- Python_问题收录总结
python IndentationError: unindent does not match any outer indentation level的问题 用python编个作业,我先用的note ...
- Servlet下载文件迅雷不支持问题真相之一
问题描述 最近在做一个下载文件的Servlet,直接使用浏览器的下载功能,完美支持,结果测试人员使用迅雷下载,就不行了,下载也能成功完成,只是迅雷下载的文件大小是悲催的0KB 真相搜罗 网上有很多帖子 ...
- cocos2d - Changing the image of a CCSprite
CCTexture2D* tex = [[CCTextureCache sharedTextureCache] addImage:@"new_image_name"]; [spri ...
- (asp)JScript读写、复制、移动文件 asp也就那回事(4)
百度博客http://hi.baidu.com/sdink/blog/ 和QQ空间同时更新http://516649425.qzone.qq.com <" CODEPAGE=" ...
- [Learn AF3]第七章 App framework组件之Popup
AF3的弹出对话框Popup 组件名称:Popup 是否js控件:是,$.afui.popup 说明:af3中的popup和af2中相比变化不大,依然是通过插件popup来实现的 方法 ...
- 总结的比较好的OpenGL教程
OpenGL Programming Guide(红宝书) http://www.glprogramming.com/red/ OpenGL Reference Manual(蓝宝书) http:// ...
- PHP 数组current和next用法
1.current 当前数组 <?php $transport = array('foot', 'bike', 'car', 'plane'); $mode = current($trans ...
- EXCEPTION:FATAL: UNABLE TO CREATE ‘…GIT/INDEX.LOCK’ FILE EXISTS
FATAL: UNABLE TO CREATE ‘…GIT/INDEX.LOCK’ FILE EXISTS Hi, Today I will share you my other experience ...