我正在努力学习泛型在编译和运行时阶段与协议相比的作用。我知道协议如何对存在类型做出反应。协议是存在的类型,因此在编译阶段,它们一步一步地采用Car类型的
struct Car: Drivable {
let numberOfWheels = 4
func drive() { }
}
car =
payload_data_0 = 0x0000000000000004,
payload_data_1 = 0x0000000000000000,
payload_data_2 = 0x0000000000000000,
instance_type = 0x000000010b50e410
ExistentialContainers`type metadata for
ExistentialContainers.Car,
protocol_witness_0 = 0x000000010b50e1c8
ExistentialContainers`protocol witness table for
ExistentialContainers.Car: ExistentialContainers.Drivable
in ExistentialContainers)
泛型呢我真的很想知道在编译和运行时阶段如何操作。他们使用指针,对吗?编译时是什么时候?在运行时,Generic的一切都准备就绪。
同样,这个例子看起来是一样的,但一个是编译的,另一个不是。。
protocol Returnable {
associateType ReturnType
}
//This will compile
func returnTheType<T: Returnable>(object: T) -> T.ReturnType { } ✅
//This won't compile
func returnTheType(object: Returnable) -> object.ReturnType { } ❌
func startTravelingWithCar(transportation: Car) { }
我想你有这样的功能,所以,
在后台,该函数还接收汽车的PWT和VWT,为该函数提供必要的信息,以便在必要时设置值缓冲区,并确定汽车对象的协议特定功能drive((的实现。这个新生成的函数现在是特定于类型的,允许您访问Car对象的任何关联类型,所有这些类型信息都是在编译时确定的——这也是为什么我们可以将关联类型作为泛型函数的返回类型,但不能对基于协议的函数执行相同操作的部分原因。