此swift扩展是扩展metalview类还是扩展vector?
在这个Swift Metal示例中,我不理解扩展的概念以及它们在这里的用法。为了理解它,谁能向我解释一下这个例子中扩展了什么此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
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)!