00:00
下面呢,我们来看一下类型断言的最佳实践,也就是说类型断言在什么地方我们可以用得到呢?它的实际的一个应用场景是什么?我们先来看第一个应用场景。在前面呢,我们是不是讲过一个USB接口案例,我们对它呢做一个改进。现在我们要求大家对phone结构体增加一个特有的方法,注意这个方法不是接口里面的。不是接口里面的,是他自己特有的一个方法。那么我们要求大家当USB接口接收的是phone时,变量接收接收的是phone变量时,还需要调用call这个方法,也就是说除了在调用接口的那两个方法之外呢,还需要调用Co这个phone结构体里面特有的一个这个方法。注意要区分,因为for有这个方法,但是camera是没有这个方法的,能理解这意思吧?好的,来,我们把这个呢最佳实践给大家讲一讲。
01:04
类型断言的最佳时间,我们给他一个标题三。好的,来,一起走下代码。我们来看看这代码如何实现啊。走代码。那首先呢,先要找到我们原先的代码所在地,我们前面是不是在讲这一个多肽的时候,我们讲过这么一点东西,对吧,我们现在呢,新建一个文件夹。叫asher。类型断言的应用apply。第一个案例。好,跟上老师思路啊,同学们,那现在呢,我就从多肽刚才讲多肽的这个地方复制一份,为什么呢?因为这里面大家看其实写的差不多了。就差那么一点点了,对不对,所以说呢,我就复制一下。复制到哪里去?
02:00
到我们的刚才写的apply。这么去粘贴一下。好,有了现在呢,我们这样子的啊,同学们。我们这样做就是phone呢,我们要增加一个方法。增加一个特有的方法。B Bo叫什么方法呢?叫靠。没问题吧,然后我写一句话。什么呢?就说我是一个手机手机。手机。呃,开始打电话,打电话。打电话。注意这个call这个方法呀,在接口里面是没有的。在接口里面没有定义这个call方法呢,是属于phone这一个结构体特有的,就是这个方法是phone结构体独有的,而且camera里面呢,也没有这个方法,能明白这意思吧。好吧,好,那是不是他这还有个名字啊,名字我干脆这样写了啊,那就P点直接调一下。
03:03
这些P点。P点啊,干脆我就不写了啊,不写了,直接这样显示一下就行了,就说手机在打电话。再打电话,OK,好,现在呢,大家看到我这个数组里边,这是一个接口数组,对吧,我待会儿要遍历它。便利。便利。这个。数组,那么我要实现一个什么功能?实现这个功能啊,这个说的更清楚的是这。对不对。说的更清楚的是这个地方。好,我把这个呢,也给同学们放到这个位置来,大家知道我们要做什么事。好,现在我们写一个computer。写个结构体type。Computer。没问题吧,Computer是个结构体。
04:00
然后呢,这里边我们,呃,这个结构体呢,有一个方法叫working方法,还记得吧。然后呢,我们就叫computer。Computer,好,给他写一个方法。这个方法呢,我们叫working。对不对,然后我可以接收一个USB这样的一个变量,然后在这里呢,我就要开始来调用了USB点。首先呢,有个star。这个没问题吧,Usb.stop。目前这个写法跟我们以前是一样的,我们先来看看能不能跑起来啊,我们看看能不能跑起来,同学们跟上老师思路。那现在我们开始遍历这个数组了,我们看看能不能先把star和stop调起来。For,循环for,我们用for来写V。逗号啊,有一个。呃,Index是吧,有个index我们就叫首先他有能拿到一个下标吧,能拿下标叫index。
05:06
老威。好的,然后呢,我用一个range,我用range来遍历这个数组,遍历过后这个V是不是就是里面的就是这个就就是这个数组里面对应的这些个元元素了,是不是就是这些结构体结构体变量了,对不对,那我就调它了啊。我直接。创建一个computer先。VAR computer。类型computer没问题吧,然后呢,用这个computer来调用,怎么调用working。调用谁V,这个V大家知道,当我们用for遍历的时候,这个V其实就是遍历的时候,就是这里面一个一个的元素,电话也好,还是camera也好,是不是就电便利出来了,能理解吧。好,现在呢,Index因为没有用到,所以说我就干脆忽略它来,我们先跑一下。
06:05
我们先来跑一下。CD点点CD到assert应用。好的,Go,让我们的命点go跑起来。我们可以看到,此时此刻运行起。好,大家看到手机开始工作,手机停止工作,手机开始工作,手机停止工作,相机开始工作,相机停止工作,这个是正常的。因为呢,因为前两个元素是手机,后一个元素是相机,对吧,那为了好看啊,各位同学,为了好看呢,我干脆换一行。对吧,我干脆换一下,好,我再来跑一下。啊,这个很讨厌很讨厌这玩意儿,好了,这这样子我们就跑起了,现在呢有一个问题。就要在这里加一段代码了,就说如果USB是什么呢?是指向一个phone结构体变量的。
07:05
结构体变量的,则还需要。还。还需要调用,靠方法。为什么说这样说呢?因为你这个你这个手机里边是不是有一个靠方法,我就想把它吊起来,但是camera里面没有,所以说你就不能这样去写,说老师我这样写行不行,USB直接。点靠,大家觉得可不可以。大家想想可不可以直接掉?肯定是不可以直接掉的,因为你这个phone里面是有靠的,但是camera里面是没有的,如果你直接这样去运行的话,大家看我们的后果是什么。我们运行一下,直接告诉你看到没有,他说USB call onend,看到没有,他说里面可能没有这个,没有这个靠方法。对不对,因为你这个接口里面本身就没有,所你本身也无法调用,就说你这样去调的话,就要求你的这个接口里边本身还要定一个call,因此这儿就算这样子你你也不能成功。
08:09
怎么办呢?类型断言。类型断言来了,类型断言大家看看到这个类型断言的好处了没有?类型断言仔细的去体会一下啊,大家注意体会。注意体会一下它的好处。好,如果说有类型断言的话,这个问题呢就变得比较简单了。这个类型变得就比较简单了,呃,这个问题就变得比较简单了,来怎么写?If。If,我们呢?来搜一下,比如说我我就尝试着直接去把它转换,就说把这个USB尝试着转成一个form。这样没问题吧?然后呢,这边有个OK。等于什么呢?USB点类型,状元form。
09:01
对不对,那如果说这个OK。OK,等于处。等于处就说他这个OK,返回来就是钻,断言成功了,T出t rue。就说这句话什么意思,就说如果这个USB在进行类型断延成phone的时候成功了,我就去执行,如果没有成功就就算了,能理解这意思吧,所以在这里呢,我就可以用phone去调用了点什么。是不是就可以成功了呀?大家看灯形状眼就在这发挥了它的作用。如果是手机,它就会进到这个if里面去调用call,如果他不是手机,那么类型端也就失败,失败过后呢,继续执行它该执行的其他的方法。也就是说在这里呢,我们做了一个类型断言,并且加了一个检测机制。对吧,因在因为这个OK本身就是布尔类型,所以说这后面这一个呢。后面这一部分其实是可以不要了。
10:02
好,我们来跑一下,看看这个类型断言在这里是不是发生了它的作用。来,走一个,请看效果。好,同学们可以看到。同学们可以看到。大家看这里。当是手机的时候,你看手机开始工作,手机打电话,手机停止工作,手机打电话,但是当它是相机的时候,你看他既没有报panic。没有报潘可同时呢,相机它仍然可以正常的运行,因为当他发现是一个相机的时候,这个断言就失败了。是不是断言就失败了,断言一旦失败,那么那个OK返回的是boss,那么他大不了就是不执行,对应的靠方法。但是它并不影响整个程序的运行。大家有没有发现我们这一个类型断言在这里起发挥了巨大的作用?
11:00
能理解吧,这种用法在我们后边去学习相关的框架,还有一些高级用法的时候会经常使用到,因此同学们一定要注意去体会它的一个好处,能理解吧,注意体会它的好处啊,我这里打上三个叹号。好的,那关于我们第一个。关于类型断言的最佳实践呢,我们就说到这里,我们把它进行一个板书。没问题吧,大家看看能不能理解,好的,我把它板述一下。好,这边代码呢,因为比较多啊,因为比较多,说说老师呢,就偷一个懒了,我就直接把这个代码拷贝过来。拷贝过来,然后呢,我直接放到我们的笔记里边去。没问题吧,现在呢,我把断言那一块关键的地方给大家标出标出。这块是一个关键点。对吧,出体,然后呢,给它标上一个蓝色,大家一看就知道,这里我们用了断言。
12:05
对不对,怎么断言的呢?就是我在这里进行一个进行了一个便利。我在这里进行一个遍历,我我把这个。就是多肽数组里面的这些元素取出来,取出来过后呢,我通过computer把它传,把这个把这个取出来的元素传给working。传给这个working,那么working做了什么事情呢?Working他首先去调用start和stop,因为调用这两个方法没有任何问题。为什么说调用这两个方没问题,因为这个接口本身就有这两个方法。你如果。对应的结构体,连这两个方法都没有去实现,根本就传不进来。但是呢,这里面又有一个phone变量,Phone结构体,它有一个自己独特的靠方法,我怎么处理的呢?我用了类型断言。我先断言它是不是一个,如果这个OK返回是一个错,那么我就去调用这个for里面的靠方法,如果这个断言失败了。
13:09
那么OK,就会返回一个false,既然返回一个false,那么这个方法不掉就。不掉就完了,对不对,能理解啊,再说一点啊,有些对于初学者来说呢,很多同学会问说老师这个变量。就是现在我标成红色这个变量名,是不是一定叫phone呢?其实这个地方的名字你可以随便写。因为它就是个变量名,你写成A也可以,写成B也可以,你写成这个写成A,你把这个地方也改成A就可以了,能理解吧,所以这个地方不是关键点啊,这个这个就是把这个USB转换过后,把这个变量赋给了这个form这个变量这个名称随便写。不是说一定要写范文的,只是说老师为了写代码比较方便呢,我就。把它取了一个form名称,你这写成A,也可以说老师写成A,这写成A可不可以也可以。
14:04
没有任何问题,但是你你取个名字叫A,是不是感觉怪怪的呀,所以说呢,我们为了比较方便呢,嗯,看这个变量名字就知道是什么意思,所以说我就直接取了一个form能理解吧,所以大家千万不要说,诶老师你这边这个名字是必须叫form,没有这个说法。随便写好的同学们,那关于我们讲的这一个类型断言的第一个最佳时间呢,我们就给同学们介绍到这里。
我来说两句