这个快速扩展是扩展metalview类还是vector?

时间:2019-06-30 13:35:25

标签: swift 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)!

...

1 个答案:

答案 0 :(得分:1)

  

这个快速扩展是在扩展metalview类或向量吗?

它是extension中的MetalView。它将嵌套结构Vertex添加到MetalView

在这种情况下,extension的目的并不是真正地“扩展MetalView的功能”。我们可以从MetalView声明(表示final class MetalView...的声明使用Vertex的事实中看到这一点。因此,extension中的任何内容都可以视为MetalView功能的组成部分,而不是其功能的扩展。

extension的目的可能是将代码分成“块”,以便于阅读和管理。您可能遇到或编写了这样的代码:

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...
}

// ...

每个委托或数据源所需的方法均以其自己的extension编写。这使得代码非常易读。您可以清楚地看到所有内容,而不仅仅是一长串方法。这些扩展真的是“扩展功能”吗?如果没有这些扩展名,MyViewController还能生存吗?并不是的。如果MyViewController不符合UITextFieldDelegate,则该代码将无法正常工作。

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

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)!

是的,但是编写该代码的人选择使用扩展名。