Swift: правильно инициализировать SIMD3 и вызвать его из структуры - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь вызвать определенную структуру, чтобы можно было изменить ее значение при нажатии кнопки. У меня проблемы с вызовом SIMD3 внутри структуры. В настоящее время у меня есть

struct CaptureData {
    var vertices: [SIMD3<Float>]

    var mode: Mode = .one
    mutating func nextCase() {
     mode = mode.next()
    }
    var verticesFormatted : String {

    let v = "<" + vertices.map{ "\($0.x):\($0.y):\($0.z)" }.joined(separator: "~") + "method: \(mode.next().rawValue)"
            return "\(v)"
        }
}

И расширение, которое мне помогло ранее от @Joshua

enum Mode: String, CaseIterable {
    case one, two, three
}
extension CaseIterable where Self: Equatable {
    var allCases: AllCases { Self.allCases }
    var nextCase: Self {
        let index = allCases.index(after: allCases.firstIndex(of: self)!)
        guard index != allCases.endIndex else { return allCases.first! }
        return allCases[index]
    }
    @discardableResult
    func next() -> Self {
        return self.nextCase
    }
}

Я пытаюсь инициализировать var instance = CaptureData(vertices: [SIMD3<Float>]), но появляется ошибка: Cannot convert value of type '[SIMD3<Float>].Type' to expected argument type '[SIMD3<Float>]'

@ Jousha также предложил мне использовать следующее:

 typealias XYZVar = (x: Float, y: Float, z: Float) 

struct CaptureData { 
var vertices:[XYZVar] 
.... other variables 
} 

Однако я также пробовал это с var instance = CaptureData(vertices: [XYZVar]), и он тоже не работал: Cannot convert value of type '[XYZVar].Type' (aka 'Array<(x: Float, y: Float, z: Float)>.Type') to expected argument type '[XYZVar]' (aka 'Array<(x: Float, y: Float, z: Float)>')

У меня вопрос, как правильно позвонить на SIMD3 и исправить указанную выше ошибку из var instance = CaptureData(vertices: [SIMD3<Float>])?

Заранее большое спасибо.

1 Ответ

1 голос
/ 16 июня 2020

Хмм, с чего мне начать?

Вы передаете [SIMD3<Float>] и [XYZVar], которые являются типами, функции / инициализатору, который ожидает значение в качестве параметра. Вот почему компилятор жалуется.

Позвольте мне объяснить.

Быстро, когда вы пишете var vertices: [SIMD3<Float>], вы говорите: «вершины» - это массив SIMD3<Float>. Теперь, если вы хотите присвоить значение «вершинам», вы можете сделать это, написав vertices = [] или vertices = [SIMD3<Float>](), они эквивалентны.

Я внес некоторые изменения в ваш код. Взгляните:


    import simd

    enum Mode: String, CaseIterable {
        case one, two, three
    }

    extension CaseIterable where Self: Equatable {

        var allCases: AllCases { Self.allCases }

        var nextCase: Self {
            let index = allCases.index(after: allCases.firstIndex(of: self)!)
            guard index != allCases.endIndex else { return allCases.first! }
            return allCases[index]
        }

        @discardableResult
        func next() -> Self {
            return self.nextCase
        }
    }

    struct CaptureData {
        var vertices: [SIMD3<Float>]

        var mode: Mode = .one

        mutating func nextCase() {
            mode = mode.next()
        }

        var verticesFormatted : String {

            let verticesDescribed = vertices
                .map({ "\($0.x):\($0.y):\($0.z)" })
                .joined(separator: "~")

            let v = "< \(verticesDescribed) method: \(mode.next().rawValue)"

            return v
        }
    }

    let data = CaptureData(vertices: [
        SIMD3<Float>(x: 0, y: 0, z: 0),
        SIMD3<Float>(x: 0.5, y: 1, z: 0),
        SIMD3<Float>(x: 1, y: 0, z: 0)
    ])

    print(data.verticesFormatted) 
    // prints: < 0.0:0.0:0.0~0.5:1.0:0.0~1.0:0.0:0.0 method: two

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...