在这个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)!
...
答案 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)!
是的,但是编写该代码的人选择使用扩展名。