# Day14--解决暧昧问题延伸出来的那些事

前言

可选在上一篇中,提到一个概念就是暧昧。它是一种可以让程序介於「有值」、「没有值」的中间状态,这种对於未来描述的「可能性」正是可选的基本概念。

不过本篇有一个重点在於:可选链是什麽东西?为什麽要使用可选链呢?

以Swift起步走上的说法:

可选链(optional chaining)是一个可以存取或呼叫属性(property)、方法(method)及下标(subscript)的过程。

称其为可选(optional)是因为当前存取或呼叫的目标可能为空(nil),而多次存取或呼叫可以用点语法(dot syntax 即.)将其全部链结在一起,所以称为链(chaining)。

也就是说可选链的主要逻辑,是与属性、方法、下标有关,而称为「可选」可能是因为它当前的属性、方法、下标可能是「空的状态」而观其样态,则像链条,所以就是Optional chaining称之了。

正文

可选链为什麽重要?

在表达程序的时候,我们假如遇到一个情况是:这个节点是可选值的时候,我们就可以以“?”来表示它。
强制解包与可选链?谁好谁比较不好?这个问题要视情况,但….

假若你标示强制解包“!”的那个程序如果是空的(nil)值的话,程序就会发生运转上的错误。
但可选链则不会发生这样的问题,假如为空,那它就只是单纯传回nil值而已。

不论可选链最後返回的属性、方法或下标是不是可选型别的值,都是返回一个可选值,所以可以用来判断这个可选链是否成功,有返回值是成功,返回nil则是失败。

可选链的小举例

上面这个例子,首先举出来的是一个阵列

我们可以看到something.first?.uppercase( ),重点是「first?」的解读,就以本例来说,我们可以这样说,因为我们不知道something这个阵列会不会是没有东西,所以我们才加上“?”

但是很显然的,这个实例里面是有的,所以结果会是”ADAM”
不过,可选链的使用也可以变得复杂一点:

上述的例子,比较关键的地方,是在adam.married指派给Married( ),因为里面是true,所以,在11行的地方:

adam.married?.answer,这个内容因为第9行指派answer为true後,所以它就有值了,为“true”。

补充:Nil coalescing

The 100Days of Swift:
The nil coalescing operator unwraps an optional and returns the value inside if there is one. If there isn’t a value — if the optional was nil – then a default value is used instead. Either way, the result won’t be optional: it will either by the value from inside the optional or the default value used as a back up.

翻译翻译:
这个空值合并运算子(有点拗口)可以解包可选项(optional),以及回传在里面的值。
如果在程序的运算过程中,最後的可选项还是产出了nil值,那这个默认值就会取而代之。而无论如何,这个运算後的结果不会是可选的,它将通过可选内部的值或用作备份的默认值。

而Nil coalescing有个很重要的表达方式,就是在默认值(default value)前面加上??,这样当最终我们程序跑出来的值是nil的时候,默认值就会出来挡刀了。

如下,”Nothing in it”就是我们这个案例的默认值:

tags: 铁人赛

<<:  D-1, length、size & count

>>:  Day21-Go档案处理

【从实作学习ASP.NET Core】Day09 | 後台 | 图片上传与预览

接续昨天的 Create 页面,今天要完成图片上传和预览的功能 图片上传到资料库的方法据我所知有两种...

Debian10安装iRedMail v1.2.1详细教程

iRedMail简介 iRedMail是基于开源的postfix、dovecot、openldap...

Strings

mystring = 'hello' print(mystring) mystring = &quo...

【Day 27】差点被我遗忘的 x AWS RDS on Outpost x 云端资料库储存

tags: 铁人赛 AWS RDS Outposts database 前情提要 差点就跟蔡琴一样,...

Day36 - 「登愣登愣,登愣登登登」~ 隐挑战 Day12 ─ 果然我的青春写扣喜剧搞错了。完

重复是学习之母。继续写是完赛之母。 继续写是完赛之母XDDDDDDDDDDD 这会不会太符合我现况...