此swift扩展是扩展metalview类还是扩展vector?

此swift扩展是扩展metalview类还是扩展vector?,swift,metal,Swift,Metal,在这个Swift Metal示例中,我不理解扩展的概念以及它们在这里的用法。为了理解它,谁能向我解释一下这个例子中扩展了什么 import UIKit import Metal extension MetalView { private struct Vertex { var position: SIMD4<Float> var color: SIMD4<Float> } } ... final class Metal

在这个Swift Metal示例中,我不理解扩展的概念以及它们在这里的用法。为了理解它,谁能向我解释一下这个例子中扩展了什么

import UIKit
import Metal

extension MetalView {
    private struct Vertex {
        var position: SIMD4<Float>
        var color: SIMD4<Float>
    }
}

...

final class MetalView: UIView {
    private let device: MTLDevice
    private let queue: MTLCommandQueue
    private let vertexBuffer: MTLBuffer
    private let renderPipeline: MTLRenderPipelineState
    private var displayLink: CADisplayLink?

...

        // Setup buffer (non-transient). Coordinates defined in clip space: [-1,+1]
        let vertices = [Vertex(position: [ 0,    0.5, 0, 1], color: [1,0,0,1]),
                        Vertex(position: [-0.5, -0.5, 0, 1], color: [0,1,0,1]),
                        Vertex(position: [ 0.5, -0.5, 0, 1], color: [0,0,1,1]) ]
        let size = vertices.count * MemoryLayout<Vertex>.stride
        self.vertexBuffer = device.makeBuffer(bytes: vertices, length: size)!

...
导入UIKit
进口金属
扩展MetalView{
私有结构顶点{
变量位置:SIMD4
变量颜色:SIMD4
}
}
...
最终类MetalView:UIView{
专用出租设备:MTLDevice
私有let队列:MTLCommandQueue
私有let vertexBuffer:MTLBuffer
私有let renderPipeline:MTLRenderPipelineState
私有变量显示链接:CADisplayLink?
...
//设置缓冲区(非瞬态)。在剪辑空间中定义的坐标:[-1,+1]
设顶点=[顶点(位置:[0,0.5,0,1],颜色:[1,0,0,1]),
顶点(位置:[-0.5,-0.5,0,1],颜色:[0,1,0,1]),
顶点(位置:[0.5,-0.5,0,1],颜色:[0,0,1,1])]
让大小=顶点数*MemoryLayout.stride
self.vertexBuffer=device.makeBuffer(字节:顶点,长度:大小)!
...
此swift扩展是扩展metalview类还是扩展vector

它是
MetalView
扩展
。它将名为
顶点的嵌套结构添加到
MetalView

在这种情况下,
扩展的目的实际上不是“扩展
MetalView
的功能”。我们可以从
MetalView
的声明(表示
最终类MetalView…
的声明)中看出这一点使用
顶点
。因此
扩展
中的任何内容都可以被视为
MetalView
功能的组成部分,而不是其功能的扩展

扩展的目的可能是将代码分成“块”,以便更易于阅读和管理。您可能遇到或编写过以下代码:

class MyViewController: UIViewController { ... }

extension MyViewController : UITableViewDelegate {
    // table view delegate methods...
}

extension MyViewController : UITableViewDataSource {
    // table view data source methods...
}

extension MyViewController: UITextFieldDelegate {
    // text field delegate methods...
}

// ...
每个委托或数据源所需的方法都是用它们自己的
扩展名编写的。这使得代码非常可读。您可以清楚地看到所有内容的位置,而不仅仅是一长串的方法。这些扩展名真的“扩展了功能”吗?如果没有这些扩展名,
MyViewController
是否可以生存?不太可能。如果
MyViewController
不符合
UITextFieldDelegate
,代码将无法工作

您是否可以在
MyViewController
类(或者您的
MetalView
类)中编写所有这些内容

final类MetalView:UIView{
私有结构顶点{
变量位置:SIMD4
变量颜色:SIMD4
}
专用出租设备:MTLDevice
私有let队列:MTLCommandQueue
私有let vertexBuffer:MTLBuffer
私有let renderPipeline:MTLRenderPipelineState
私有变量显示链接:CADisplayLink?
...
//设置缓冲区(非瞬态)。在剪辑空间中定义的坐标:[-1,+1]
设顶点=[顶点(位置:[0,0.5,0,1],颜色:[1,0,0,1]),
顶点(位置:[-0.5,-0.5,0,1],颜色:[0,1,0,1]),
顶点(位置:[0.5,-0.5,0,1],颜色:[0,0,1,1])]
让大小=顶点数*MemoryLayout.stride
self.vertexBuffer=device.makeBuffer(字节:顶点,长度:大小)!
是的,但是编写代码的人选择使用扩展

final class MetalView: UIView {
    private struct Vertex {
        var position: SIMD4<Float>
        var color: SIMD4<Float>
    }
    private let device: MTLDevice
    private let queue: MTLCommandQueue
    private let vertexBuffer: MTLBuffer
    private let renderPipeline: MTLRenderPipelineState
    private var displayLink: CADisplayLink?

...

        // Setup buffer (non-transient). Coordinates defined in clip space: [-1,+1]
        let vertices = [Vertex(position: [ 0,    0.5, 0, 1], color: [1,0,0,1]),
                        Vertex(position: [-0.5, -0.5, 0, 1], color: [0,1,0,1]),
                        Vertex(position: [ 0.5, -0.5, 0, 1], color: [0,0,1,1]) ]
        let size = vertices.count * MemoryLayout<Vertex>.stride
        self.vertexBuffer = device.makeBuffer(bytes: vertices, length: size)!