我是一名刚开始使用Swift的C++程序员.我观看了Dave Abrahams的WWCD演讲"Swift中的协议定向编程",我对可以创建受协议约束的异构数组类型的方式感到好奇.
要使用视频中的示例,给定一个协议Drawable
和两个实现它的结构:
protocol Drawable { func draw(renderer: Renderer) // Renderer is another protocol } struct Circle : Drawable { func draw(renderer: Renderer) { // Implementation } } struct Rectangle : Drawable { func draw(renderer: Renderer) { // Implementation } }
可以将a定义Diagram
为包含Drawable
s 数组
struct Diagram : Drawable { var elements: [Drawable] = [] func draw(renderer: Renderer) { for e in elements { e.draw(renderer); } } }
我的问题是,这个异构elements
数组究竟是如何在封面下工作的?由于各种实现的Drawable
大小可能不同,我无法看到它们如何在内存中的高效数组中布局.这是否意味着这样的"协议数组"实际上是在表面下使用每元素堆分配和动态/虚函数调用?