可空类型,对于熟悉C#的同学一定不会陌生。在C#里面值类型都是不能为空的,比如int类型默认为0,bool默认为false。但是我们给int加上?后,就是一个可空类型了。
那么Swift里面呢。Swift里面没有区分值类型,引用类型(或许有,可能我还没看到这方面的资料)。那这个可空是怎么回事呢。原来在Swift里变量默认是不为空的。看代码:
你给一个String类型的变量付空值nil是会报错的。
那怎么让一个变量能为空呢,做法跟C#一样,加一个?。看代码:
那怎么取可空变量的值呢。这里就得拆解(unwarp)的概念了。比如你直接使用上面的name赋值给另外一个name变量的话是会报错的。要使用!取出其中的值。
既然变量是可空,那么我们使用的时候就免不了判空。判空也跟C#一样。
这里有2个问题要提一下。就是当你用 !=去判断不为nil的时候,一定要注意了。一定要在!=两边加上空格。不然是会报错的。因为如果不加空格的话,编译器没法区分是对变量进行拆解还是取非运算。还有一个,对于非空类型的变量,是直接不能进行判空的。因为上面说了,变量默认是不能为空的,所以非空类型的变量去判空是没有意义的。这里对于习惯C#/JAVA的同学就会比较坑了。因为我们已经养成了有null风险的地方进行null检查。如下:
一点思考:
这里还是跟C#进行一下比较。.NET C#里类型分值类型,引用类型。引用类型的变量全部可以为空。值类型不能为空。如果想要为空,那就是用可空类型。那我们开发的时候,可以发现其实使用引用类型的时候比使用值类型的时候多多了。因为除了FCL的Class,我们自定义的各种Class也都是引用类型。但是Swift却正好相反,Swift里变量默认是不能为空的。也就是跟C#里的值类型一样,都要给默认值。需要空的时候就使用可空来处理。这里也可以看出来2门语言的设计者不同的两种思路。C#觉得对象的属性/变量大部分时候是存在可空需求的。而Swift觉得对象的属性大部分时候是不存在可空需求的。C#里变量想空就空,比较灵活。但是这样也造成在使用的时候不得不小心翼翼,所以我们到处都是if(obj!=null)这种代码。Swift的话就不用到处Check null,但是不够灵活。比如当我发现某个属性有可能为空的时候,还要去修改声明,修改完声明,前面使用到这个变量的地方的代码全都要改,要判空,要拆解。这两种方案可以说各有利弊,不过个人比较偏向C#。