意义是其存在的根本,是其逻辑的根本,是其方法论的根本。方向的根本。
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)类型:而可选值类型可以拿过来,但是不一定能使用。