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类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个泛型类出现,他集成的操作函 ...
随机推荐
- kali 安装KVM教程---》给自己的笔记
⦁ 查看系统环境支持 egrep 'svm|vmx' /proc/cpuinfo 如果不支持则是 没有任何输出如果支持有类似下面的输出: ⦁ 安装软件 sudo apt-get install kvm ...
- c++ 文件增加#ifndef、#define 和 #endif 语句的意义
文件currency.h (或 currencyOverload.h) 包含了 currency类的声明和实现细节. 在文件头, 应该加上语句 #ifndef Currency_ #define Cu ...
- WFA 认证 启动 sigma_dut方法
WFA认证需要启动sigma_dut,记录记录一下启动过程. Android O平台命令如下 adb shell svc wifi disable adb shell rmmod wlan adb s ...
- 查看eclipse版本信息
http://www.cnblogs.com/caiyuanzai/archive/2013/01/11/2855796.html 如果要查询eclipse数字版本号的话,可按如下进行操作: 1. 找 ...
- eclipse debug 执行到断点处并没有停下,断点无效问题
转自:http://blog.csdn.net/cuidiwhere/article/details/14434439 现象: 利用eclipse debug时,执行到断点处并没有停下.正常情况下,在 ...
- Linux 定时任务crontab_014
1. crontab命令概念 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使 ...
- iOS模拟(糟糕的)网络环境
有时候为了模拟在糟糕的网络环境下app的表现,会故意拔网线(断wifi),苹果其实提供了专门的工具来精确地模拟你在几个预设的场景下的网络连接情况:Network Link Conditioner 点击 ...
- keynote代码高亮【转】
码农即使做ppt,也离不开代码,在keynote下,如果要粘贴代码,如何做到语法高亮呢? 补充1,该功能由pygments提供支持,所以支持的语言见:http://pygments.org/langu ...
- JavaBridge
有的时候我们需要在PHP里调用JAVA平台封装好的jar包里的class类和方法 一般的做法是采用php-java-bridge做桥接 1.实现原理: 先打开java的一个监听端口,php调用java ...
- rpc框架 SimpleXMLRP
一台电脑去控制另一台电脑干事情,最常见的就是web. 用户get/post一个url,服务端根据url地址和参数去做相应的事情把结果返回给客户端. server.py #coding=utf8 fro ...