/* 下面是介绍Optional Chaining 和 Nil-Coalesce */

// Optional Chaining (可选链)
if let errorMessage = errorMessage {
errorMessage.uppercaseString
}
// 这种写法完全等价于上面的写法, 当errorMessage有的时候, 才会去执行"?"后面的代码, 否则就终止与"?"
// 并且会返回nil
errorMessage?.uppercaseString
// 这种写法也可以, 但和上面的写法表示的意思完全不一样, 表示解包后就是一个字符串, 然后执行"!"后的代码
// 一样存在风险(当errorMessage为nil时, 就会报错)
errorMessage!.uppercaseString // 另外一个可选值调用方法或者访问属性返回的是可选值, 可以使用可选链来达到精简代码的目的, 例如
errorMessage?.stringByRemovingPercentEncoding?.stringByRemovingPercentEncoding // 这里的newErrorMessage并没有显式声明为可选型变量, 但由于errorMessage?.uppercaseString可能返回nil
// Swift就认为newErrorMessage必须是一个可选型变量
let newErrorMessage = errorMessage?.capitalizedString // 所以也可以这样进行解包操作
if let newErrorMessage = errorMessage?.capitalizedString {
print(newErrorMessage)
} // Nil-Coalesce
// 方式1: 由于message一开始并没有赋值, 在赋值之前对其进行使用, 会出现错误, 就有了方式2
let message: String
if let newErrorMessage = newErrorMessage {
message = newErrorMessage
} else {
message = "No Error"
}
print(message) // 方式2: 三目运算
let message2: String = newErrorMessage != nil ? newErrorMessage! : "No Error" // 方式3: 更简洁 (表示, 如果newErrorMessage的值为nil, 就赋值为??后面的值, 否则就把newErrorMessage解包后的值进行赋值)
let message3 = newErrorMessage ?? "No Error"

  

Swift中可选型的Optional Chaining 和 Nil-Coalesce(Swift2.1)的更多相关文章

  1. 浅谈 Swift 中的 Optionals

    input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...

  2. Swift中可选类型(Optional)的用法 以及? 和 ! 的区别 (转载博客,知识分享)

    本文转载自:代码手工艺人的博客,原文名称:Swift之 ? 和 ! Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之 ...

  3. Swift Optional Chaining

    Optional Chaining介绍 关于「optional chaining」,<The Swift Programming Language>是这么描述的: Optional cha ...

  4. swift中为什么要创造出可选型?

    (1)因为nil这个东西,swift中没有就是没有.  Int? 叫 整型可选型,如果不提前声明,直接赋值变量 nil会报错 . 可以将Int赋值给Int?   ,但是不能将Int?赋值给Int . ...

  5. [翻译]理解Swift中的Optional

    原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...

  6. Swift中的Optional类型 (可选类型)与强制解包 ? !

    我们在swift的开发中会经常遇见?和! ,理解这两个符号深层次的内容对我们的开发是相当有利的: 目前网上对swift3.0的教程还相当的少,如果去搜索会发现早期的说法,在定义变量的时候,swift是 ...

  7. 重新认识Swift中的可选型(Swift2.1)

    //: Playground - noun: a place where people can play import UIKit /* Swift中nil代表是是另外一种类型, 而不像OC那样, 任 ...

  8. swift中,Optional、?与!之间的关系

    swift中,Optional.?与!之间的关系 Optional <ClassName> 与 ClassName? 等价 对 ClassName! 强制取值会导致崩溃(如果对象为nil时 ...

  9. TypeScript 中 Optional Chaining 和 Nullish Coalescing

    Optional Chaining 解决的问题是重复且无意义的判空,之所以说无意义,是对业务来说它不是必需的,但不判空,程序直接就挂了,比如: let x = foo.bar.baz();   这里的 ...

随机推荐

  1. net Random 随机数重复的问题

    在实际项目中不仅需要随机产生密码字符串,还要一次生成多个.我把生成随机字符串的方法放到for循环中,问题出现了. 生成的字符串,会重复. 经过多方查证,原因在代码. //使用与系统时间相关的种子 Ra ...

  2. Linux——搭建PHP开发环境第一步:apache

    原文链接:http://www.2cto.com/os/201511/450258.html ##### Apache 编译安装[root@localhost ~]# yum install gcc ...

  3. ExtJS5_主界面上加入顶部和底部区域

    为主界面加一个顶部区域和底部区域.一个管理系统的界面可以粗分为顶部标题部分.中间数据展示和处理的部分.底部备注和状态部分. 在增加这二个区域之前,我们先在MainModel.js中加入一些数据. Ex ...

  4. ISO7816协商模式和特定模式

    ISO7816协议的协商模式和特定模式好多使用者都搞不明白,还经常有客户电话询问,这里将其澄清一下: ISO7816协议的协商模式和特定模式由复位应答字节TA2确定,下面是TA2的字节定义 TA2的存 ...

  5. LED驅動芯片 兩種恒流控制方式

    下面要說的是,兩種恒流控制模式的開關電源,從而產生兩種做法.這兩種做法無論是原理,還是器件應用,還是性能差別,相當都較大.     首先說原理.第一種以現在恒流型LED專用IC為代表,主要如9910系 ...

  6. DateTime用法

    //今天 DateTime.Now.Date.ToShortDateString(); //昨天,也就是今天的日期减一 DateTime.Now.AddDays(-1).ToShortDateStri ...

  7. Java学习日记-4 StringBuffer类和数组

    一.StringBuffer类 StringBuffer是一个可变字符序列. 1.1 构造函数 StringBuffer() 构造一个不带字符的字符缓冲区,初始容量为16个字符. StringBuff ...

  8. X86 I/O端口

    与外设的交互都是通过读写外设上的寄存器进行的,外设的寄存器也成为“I/O端口”,它有两种编制方式:统一编址和独立编址. 统一编址: 外设接口中的IO寄存器(即IO端口)与主存单元一样看待,每个端口占用 ...

  9. windows 编程—— 使用函数笔记

    目录: 创建滚动条 滚动条函数(新老版本) 取得设备内容句柄hdc 设置 hdc 中的属性 画点画线 画填充图形 使用自定义的 画笔 和 画刷 矩形.区域和剪裁 关于GDI映像模式 其他常用的方便计算 ...

  10. 【高级算法】模拟退火算法解决3SAT问题(C++实现)

    转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46453761 ---------------------------------- ...