具有协议逻辑的存在类型和泛型 Swift 2

Existential Types and Generics with Protocols Logic Swift 2

我正在尝试了解泛型与协议相比如何在编译和运行时阶段发挥作用。 我知道协议如何与存在类型做出反应。协议是存在类型,因此在编译阶段逐步采用 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)

泛型怎么样? 我真的很想知道在 compileruntime 阶段是如何工作的。他们使用 pointers 对吧?什么时候编译?在运行时,一切都已为泛型准备就绪。

这个例子看起来也一样,但一个是编译另一个不是..

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 对象的任何关联类型,并且所有这些类型信息都是在编译时确定的——这就是我们可以将关联类型设为 [=15 的部分原因=] 类型的通用函数,但不能对基于协议的函数执行相同的操作。