protocol Runnable {
associatedtype Speed;
var speed : Speed { get }
}
class Person :Runnable {
var speed: Int { 0 }
}
class Car : Runnable {
var speed: Double { 0.0 }
}
func get(_ type:Int) -> some Runnable {
return Car()
}
在get这个方法中,多了一个some,其实就是要求我们只能返回一种类型,如果把some去掉,会报错,为什么呢,我们看看Runnable这个协议,有一个speed这个属性,而继承这个属性的,有Person和Car对象,这两个对象针对speed的初始化,都是不同的类型,那么在返回的时候,就无法确定要返回的是Person对象,还是Car对象,编译器无法识别
其实,加上some这个关键字,不透明类型,意在告诉开发者,这个返回值类型是不公开的,可能是Person,也可能是Car对象,因为那两个对象都继承了Runnable这个协议,但是又只能返回一种类型,编译器才能确定,相当于内容被包装起来了,编译器知道你要返回的是哪个对象了,但是外部的人并不知道。
截屏2022-03-02 下午3.53.47.png
从上图中,我们可以看到r1对象调用speed的时候,并没有告诉我们这个对象就是Person对象,但实际上是Person对象,只是外界并不知道,有点隐匿了的感觉
网友评论