Это быстрое расширение расширяет класс metalview или вектор? - PullRequest
1 голос
/ 30 июня 2019

В этом примере 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 Ответ

1 голос
/ 30 июня 2019

Это быстрое расширение, расширяющее класс 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)!

Да, но тот, кто написал этот код, решил использовать расширения.

...