可选值类型/Optional:“核 心 是 或者 而 不 是 和。”

本文探讨了编程中nil的概念,它是数据不存在或不确定的标志,尤其在可选值类型中扮演重要角色。文章通过实例说明了nil在数据范围、函数输入和代码逻辑中的作用,强调了使用可选值类型处理潜在nil值的重要性,以及Swift语言中初始值和可选类型的规定。
摘要由CSDN通过智能技术生成

意义是其存在的根本,是其逻辑的根本,是其方法论的根本。方向的根本。​​​​​​​


nil不能独立存在,nil是在Optional下的部件。


数据的存储,读取与内存。

空指针

空,nil。

三者的联系。

数据源来自外界:用户输入,


nil有多普遍?正常配套的,本来应该有值算是正常的,如果没有值,基本都是nil

例如:变量初始化是正常,未初始化,为nil

nil有多正常?假如你去书店买书,正常权重不是百分百,也有可能你要的书,那个书店没有。

nil是所有无的集合。在这些无中,有些是因为在正常范畴之外却又处于一个体系。


范围上没有;流程上的暂时没有;突发,异常情况。​​​​​​​​​​​​​​


nil一般出现在哪里?

​​​​​​​


可选值类型是基础类型,或者nil。定位nil,有助于认识可选值类型。

首先,这个nil情况,不是我们臆想出来的,它是客观存在的。可能他的存在具有普遍性。

例如:

有一个函数功能是输入数组下标,输出这个下标对应的具体值。

假如数组A的下标是0-9,

对于数组A来说,我们都知道0-9的下标都能给你一个数。这个范围外,就没有。用户可能输入1000这个下标,小数下标等等各种情况。有些函数设计的时候,会先读取要服务的数组的下标范围是多少,你输入的下标会进行判断,符合再进行下一步,不符合直接不进行。那当直接把1000传进去进行时,代码具体发生了哪些运作呢?

对于0-9这种正确的情况,我们不讨论,我们来讨论不在0-9的情况。

从问题的定位来看,对于下标是0-9的数组,在我们输入1000这个不在范围内的下标的时候,不能正确给出值,出现了问题。那么:

出现问题是在=右边,即给出1000下标后出现错误,

还是在=左边,输入1000,与0-9不匹配就直接开始错误。这个可能要看那种带内存地址的码。

或者问,出现范围不匹配的时候,是怎么诞生nil的,nil在编译器里是怎么定义,运作的?

当输入的无限>功能的有限且参与功能的运算,必然有些输入产生不了值。

图:一个大圆里有一个小圆,大圆代表输入无限性,小圆代表功能有限性。

图:一个水管,下雨天。输入的无限性就好比漫天飞雨,功能的有限性代表那个水管入口。落进水管入口,才能通过水管传递到别的地方。落不进水管,无法通过水管传输到别的地方。

逆向:当功能的有限性<输入的无限性,会有输入产生不了值。就需要使用可选类型。

​​​​​​​东西让事情的叙述更合理话。回顾可选值。

有,经过管道,     有结果。

有,经过管道,     没有结果。

有,没经过管道, 没有结果。​​​​​​​

​​​​​​​没,没经过管道, 没有结果。


续上:

代码的输入范围>代码的处理范围。 ->出现这种情况,在代码的功能逻辑范畴之外(但却在编译器之内),根据实际输入的逻辑判断。(当然,高级点的代码可能会有输入判断环节,目前不讨论,就讨论现在这种代码没有任何约束的情况。)


 =两边的相等性:如果=右边的取值范围存在nil,那么=左边的数据类型必须是可选值类型。

假如是1到100,

可选值类型处理的是有1到100,或者没有。

不会处理101,102

总结:绑定nil的数据类型。


最新更新:swift语言是类型明确,需要有初始值。如果给不了初始值,就不能用正常的数据类型标识,而应该用能表明暂时没有初始值/nil的可选值类型。


最新更新:如果你的起点是Int,转而学Int?,会比较难。

但是如果你的起点是Int?,向下看Int,会比较简单。

Int?=Int或者nil

而Int就是考虑过nil,已经不用考虑nil的直接使用。

​​​​​​​

​​​​​​​

意识提升:看到nil这三个字母,大多会停留在nil这三个字母就没了。

我们的认识要往下潜,

nil只是一个名字,代号。而这个名字,代号,所代表的东西才是重点!!!那些东西会引起程序报错。

nil就代表着错误。

我们说闯红灯不好,违反交通法1

但并不是说你有一个违反交通法1的名字,闯红灯这个事情就变得正。

在代码中也是,闯红灯用nil这个名字,但是闯红灯这个行为在代码的法律里还是会报错。

你把Double赋值给Int也违反了代码的法律,也会报错。

​​​​​​​

方法论:nil背后的参与代码会报错。

编译器不会同意让nil参与代码的正常运行。

写代码的人要主动的不要让nil参与代码运行。

两个汽车相撞,车会撞坏。

我们不会去改变车撞撞坏这个层面的东西,

我们会处理不让车撞。

nil报错相当于撞车,

可选值就是让车不撞,让nil不撞代码。


Int类型的取值范围:-2147483648 ~ 2147483647

Double类型的取值范围:-1.7976931348623157E308~ 1.7976931348623157E308

Int?的取值范围:-2147483648 ~ 2147483647 或者 nil

这个nil,不仅仅是不在Int上,因为Int之外还有Double等数据类型,而Double里也不包含nil。

nil是一种数据类型的圈外生物。只要可能没值,就是同一种情况,不管你是Int,还是Double。


那种模糊不清的nil情况我们先不去浪费脑子,我们先来看看十分常见的值无效情况:

一个下标为0-9的数组

一个函数,其功能是输入下标,显示该下标的值。

你输入0-9的下标,函数得出的结果一切正常。

但是,你非要随心所欲,输入个100下标,也没人会拉着你的手不给输入100.

但是输入100就会出问题。

出问题我们理解,但更多的时候,我们要的不是出问题程序崩溃。

只要某个值可能没有,就需要用可选类型且必须用可选类型。

因为可选类型包含nil,能够适应,处理nil情况。

而正常类型它的取值范围是不包括nil且排斥nil,遇到nil就要报错了。

正常数据类型在编译器里畅通无阻,而可选值类型是建立在正常数据类型上的辅助,需经过判断进入正常数据类型才能畅通无阻。可选值类型可以为nil,但是不给进入正常使用,nil一连接正常使用就报错。

这种乱七八糟为nil的情况很多。我们需要的不是出现nil卡在那边,还要给出提示,作出调整让事情顺利进行。


每种数据类型的集合范围,集合内成员的特点都确定好了。

每种数据类型对该数据类型之外的所有数据类型(包括nil)排斥:

你不能把Double类型或其它非Int类型的数据和Int类型的数据用=连接。

Int≠Double

Int≠nil

Int类型的数据只能和Int类型的数据用=连接。

Int=Int   //除此之外,都是错的。

Int≠Int?


var a:Int = 1              //a变量可以是-2147483648 ~ 2147483647 取值线段中的某一个整数


var b:Double = 1.1   //b变量可以是-1.7976931348623157E308~ 1.7976931348623157E308 取值线段中的某一个小数


var c:Int? = 1           //c变量可以是-2147483648 ~ 2147483647 取值线段中的某一个整数 或者 nil  

                                //错误理解:c变量可以是-2147483648 ~ 2147483647 取值线段中的某一个整数  nil


可选值类型的好处:

可选值类型,可以面对nil情况,且可以切换到Int类型,进入正常使用。而Int类型定义后,无法改变为可选值类型,并且,无法处理nil情况。

Int,double等,他们都有自己的取值范围。他们的取值范围不包括nil

应用场景:

设计一个函数,你输入一个下标,函数传出来的结果是下标对应的值。

假如那个数组的下标范围是0-6,你使用函数的时候,给函数传了一个9的下标。而这个下标不在正常范围内。这个时候,可选值类型就可以用到了。

函数传出来的结果是optional类型。​​​​​​​

非或数据类型和(非或数据类型||nil)都会在代码中使用:

非或数据类型:在代码的任何地方,不需要任何处理,直接用。 

无法处理nil情况/遇到nil值直接报错。

(非或数据||nil)类型:而可选值类型可以拿过来,但是不一定能使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值