Swift的可选类型Optional

news/2024/7/20 22:04:14 标签: swift, ios

1、Optional类型的概念

可选类型用来表示“有一个值,它等于x或者根本没有值”。当我们遇到Optional类型时,就会明显知道这里的值可能为nil,我们必须谨慎处理。

2、Optional类型的实现

var optionalInteger: Int?
//或者
var optionalInteger: Int!

其中?和!都是可选类型的语法

3、Optional类型的本质

Optional其实是个枚举(enum)(严格来讲:应该是enum和泛型为基础的高阶抽象类型),分别是None和Some(T),如果可选类型为nil就会命中None的Case。

enum Optional<T> : NilLiteralConvertible, Reflectable {  
        case None  
        case Some(T)  
 
        //...
}

如果命中Some(T)的Case,就会得到一个“包装”后的值(a wrapped value),如果想要拿到真正的value,就需要“拆包”,否则你会得到的是Optional(value)。

4、Optional类型的运用(拆包)

可选绑定

可选绑定可以用在if和while语句中来对可选类型的值进行判断并把值赋给一个常量或者变量。

可以使用可选绑定来判断Optional是否包含值。

如果包含就自动解包,把值赋给一个临时的常量(let)或者变量(var),并返回true,否则返回false。

基本语法:

if let constantName = someOptional {
    statements
}

示例:

var myString:String?
myString = "Hello, Swift!"
if let yourString = myString {
   print("myString 值为 - \(yourString)")
}else{
   print("myString 值为 nil")
}

强制解包

Optional是对其他类型的一层包装,可以将它理解为一个盒子

  • 如果为nil,那么它是个空盒子
  • 如果不为nil,那么盒子里装的是被包装类型的数据
  • 如果要从Optional中取出被包装的数据,需要使用感叹号!进行强制解包
  • 如果对值为nil的Optional进行强制解包,将会产生运行时错误。
var myString:String?
myString = "Hello, world!"
if myString != nil {
   // 强制解析
   print( myString! )
}else{
   print("myString 值为 nil")
}

可选类型不能直接赋给其它类型,如Int?不能直接赋给Int型变量,要先解包,值为nil的可选类型不能解包 

var text: String? = "abc"
print(text)     //输出结果为Optional("abc")
print(text!)    //输出结果为abc
var a:String
a = text!       //强制解包

隐式拆包

隐式解包直接在定义时加!

对于会在viewDidLoad进行初始化的变量,可以直接定义为var str: String!,称为隐式拆包,在进行操作的时候也需要添加!进行拆包。

let text:String! = "abc"    //text的类型还是Optional
print(text)    //输出结果为Optional("abc")
var a:String
a = text    //隐式类型转换
print(a)    //输出结果为abc

!和?的区别

?的使用场景:

  • 声明Optional值变量
  • 在对Optional值操作中,用来判断是否能响应后面的操作

!的使用场景:

  • 强制对Optional值进行拆包
  • 声明隐式拆包变量,一般用于类中的属性


 


http://www.niftyadmin.cn/n/5011028.html

相关文章

2023-09-05 LeetCode每日一题(从两个数字数组里生成最小数字)

2023-09-05每日一题 一、题目编号 2605. 从两个数字数组里生成最小数字二、题目链接 点击跳转到题目位置 三、题目描述 给你两个只包含 1 到 9 之间数字的数组 nums1 和 nums2 &#xff0c;每个数组中的元素 互不相同 &#xff0c;请你返回 最小 的数字&#xff0c;两个数…

初学python爬虫学习笔记——爬取网页中小说标题

初学python爬虫学习笔记——爬取网页中小说标题 一、要爬取的网站小说如下图 二、打开网页的“检查”&#xff0c;查看html页面 发现每个标题是列表下的一个个超链接&#xff0c;从183.html到869.html 可以使用for循环依次得到&#xff1a; x range(183,600) for i in x:pr…

【Python程序设计】Python 中的环境变量【05/8】

一、说明 以下文章是有关 Python 数据工程系列文章的一部分&#xff0c;旨在帮助数据工程师、数据科学家、数据分析师、机器学习工程师或其他刚接触 Python 的人掌握基础知识。本篇将讲述环境变量的问题。 迄今为止&#xff0c;本初学者指南包括&#xff1a; 第 1 部分&#xf…

YOLOV7改进-轻量级上采样算子CARAFE

CARAFE 可以作为论文中的小创新点 上采用算子参数可以跑一跑&#xff0c;增加实验丰富度&#xff0c;工作量 1、复制代码,到common文件的最底下就可以了 2、yolo.py复制 3、yolov7里就俩上采样&#xff0c;替换名称&#xff0c;后面参数可以调 打印出来便于观看参数

测开之 Python 自动化全栈工程师 + 性能专项

功能测试基础 接口测试基础 接口的通信原理与本质 cookie、session、token 详解 接口测试的意义与测试方法 接口测试用例的设计 app 测试 app 流程测试 app 兼容性测试 app 稳定性测试 app 性能专项测试 app 抓包 UI 功能测试基础 常见功能测试方法&#xff1a;等价类&…

关于el-date-picker组件修改输入框以及下拉框的样式

因为业务需求&#xff0c;从element plus直接拿过来的组件样式和整体风格不搭&#xff0c;所以要修改样式&#xff0c;直接deep修改根本不生效&#xff0c;最后才发现el-date-picker组件有一个popper-class属性&#xff0c;通过这个属性我们就能够修改下拉框的样式&#xff0c;…

汇编:lea 需要注意的一点

lea和mov的效用上不一样&#xff0c;如果当前%rsi的值是0&#xff0c; lea 0x28(%rsi),%rax &#xff0c;这个只是计算一个地址&#xff0c;而不是去做地址访问。 mov 0x8(%rsi),%rsi&#xff0c;而这个mov&#xff0c;在计算完地址&#xff0c;还要访问内存地址。如果rsi是0&a…

苹果macOS 13.5.2正式发布 修复ImageIO进程

9 月 8 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5.2 更新&#xff08;内部版本号&#xff1a;22G91&#xff09;&#xff0c;本次更新距离上次发布隔了 21 天。 需要注意的是&#xff0c;因苹果各区域节点服务器配置缓存问题&#xff0c;可能有些地方探测到…