Это быстрое расширение, расширяющее класс 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)!
Да, но тот, кто написал этот код, решил использовать расширения.