1.为什么使用optional

由于swift语言是类型安全的,即在初始化变量或常量时,不能将其赋值为nil,否则会报错:

var a = nil

然而,我们在定义变量时并不一定要初始化,函数的返回值并不一定有具体的值,这就为我们使用变量带了不便,故swift提供了optional,即可选类型,来缓解这个问题。

可选类型,顾名思义即使用该类型的声明的变量可以有值,亦可以没有值(nil)。

2.optional的使用

在swift中,在声明变量的类型后面加上?即可申明可选类型:

var str: String? = "abc"

由于可选类型变量的值有可能为nil,故不能直接使用,在swift中,主要有以下四种方式使用optional:

  • optional拆包

    var str: String? = "abc"
    print(str!.count)   // 使用!进行拆包
    

  • optional隐式拆包

    var str: String? = "abc"
    print(str!.count)
    

  • optional binding

    var str: String? = "abc"
    if let realStr = atr {print(realStr.count)
    }
    

  • optional选择链

    var str: String? = "abc"
    let count = str?.count // count仍是可选类型
    // 对count使用拆包方式进行访问
    if count != nil {let lastIndex = count! - 1print(lastIndex)
    }
    

3.optional原理浅析

optional并不是swift语言本身带有的特性,而是通过枚举实现的,下图是swift源码截图

我们可以通过如下方式定义可选类型,其效果完全等同于上述使用?的方式

var str: Optional<String> = "abc"
if let realStr = str {print(realStr)
}

我们还可以使用Optional泛型提供的unsafelyUnwrapped方法进行解包:

var str: Optional<String> = "abc"
let count = str.unsafelyUnwrapped.count
print(count)

浅析swift optional相关推荐

  1. 优雅的剥洋葱:浅析 Java Optional 类

    前言 杨宗纬唱过一首歌,叫做<洋葱>,里面有一句是:"如果你愿意一层一层一层的剥开我的心...",歌曲是非常的感人. 其实在咱们程序员日常开发中,也经常会遇见需要一层一 ...

  2. Swift的一些问题

    一些Swift的问题列表: How to use a Objective-C #define from Swift How do I convert an NSDictionary to a Swif ...

  3. swift可选类型_Swift可选

    swift可选类型 Swift Optional is a very important underlying concept in Swift programming. Optional is so ...

  4. swift 的init_Swift init()

    swift 的init In this Swift tutorial, we'll be discussing an important concept, namely Swift init or S ...

  5. swift 可选链_Swift可选链

    swift 可选链 Swift Optional Chaining is a very useful feature. Optionals are a type in Swift that wrap ...

  6. A站 的 Swift 实践 —— 上篇

    背景介绍 AcFun俗称为"A站",作为一款二次元内容社区产品,以"认真你就输了"为文化导向,倡导轻松欢快的亚文化.AcFun涵盖了中长视频,小视频,番剧,文章 ...

  7. Swift 代码调试核武-LLDB调试基础

    原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow 前言:LLDB是个开源的调试器,与XCode绑定 ...

  8. 将指定页面横屏 landScape

    碰到一个功能就是使指定的页面横屏,然后找了一些方法其中之一是两句代码:如下(不推荐,有的swift环境支持有的不支持) //MARK:将这个页面横屏的方法override func shouldAut ...

  9. lldb常用命令与调试技巧

    一.基本介绍 LLDB是个开源的内置于XCode的调试工具,它能帮助我们在开发中更快的定位和调试bug,无论正向和逆向开发中都有很大的作用.lldb对于命令的简称,是头部匹配方式,只要不混淆(不提示歧 ...

最新文章

  1. beyond compare 4 的30天试用期已过-解决方法
  2. maven 加入第三方库_maven加载第三方jar不能加载
  3. 谷歌浏览器安装过程 0911
  4. java对多态的理解_对于Java中多态的理解
  5. Android批量图片加载经典系列——使用二级缓存、异步网络负载形象
  6. ffmpeg h264 解码 转
  7. VS Code 运行Vue项目
  8. oracle 检查链接数,oracle连接数检查
  9. 关于直播,所有的技术细节都在这里了(三)
  10. pip安装mysql驱动_windows环境下Python安装mysql驱动遇到“坎”
  11. 离散数学第九章—学习笔记
  12. 医疗信息管理系统(HIS)——>业务介绍
  13. 左手补贴右手社交 杀入直播红海的拼多多会有机会吗?
  14. 【观察】UCloud:决胜东南亚“正当时”,做出海企业“加速器”
  15. Python-字符串的判断、拆分和拼接
  16. python环境下数据操作_数据分析环境搭建和Python基础知识
  17. 【CodeChef】【DP】Count Subsequences
  18. Openxml读取和生成简单类型的Excel
  19. Secure CRT 7.0 通过 SSH服务登录 Vmware 下的Ubuntu 12.04服务器
  20. 【紧急】Log4j又发新版2.17.0,只有彻底搞懂漏洞原因,才能以不变应万变

热门文章

  1. python之解释性语言
  2. 关于显式类型转换以及隐式类型转换
  3. 并发控制中的乐观锁与悲观锁
  4. QPixmap存在的坑,内存泄漏
  5. matlab 空间曲面的绘制
  6. Qt|QToolBtton实现三态图标及文字变化
  7. 拼音解析搜索--自动解析拼音汉子组合(包含多音字,拼音缩写)
  8. 二分法的算法及应用场景(只更新了一种)
  9. 趣图:深度学习之大炮打蚊子
  10. idea 断点线程_在IntelliJ IDEA中多线程并发代码的调试方法