存在类型和泛型与协议逻辑 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)

泛型怎么样?我真的很想知道编译运行时阶段的行为。他们使用指针对吗?什么时候编译?在运行时,一切都为泛型做好了准备。

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

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 对象的任何关联类型,所有这些类型信息都是在编译时确定的——这就是为什么我们可以将关联类型作为返回类型的部分原因一个通用函数,但不能为基于协议的函数做同样的事情。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...