Бинарный оператор «*» не может применяться к операндам типа «SCNVector3» и «Double»

Мне нужно умножить SCNVector3 на 0,1, чтобы получить новую позицию. Когда я пытаюсь это сделать, я получаю ошибку ниже. Это работало раньше в более ранних версиях Xcode. Я использую Xcode 10.1 с компилятором версии Swift 4. Я видел другие ответы на такой же вопрос, но здесь тип данных отличается.

Binary operator '*' cannot be applied to operands of type 'SCNVector3' and 'Double'

И код, который я использую, приведен ниже,

   guard let pointOfView = sceneView.pointOfView else { return }

    let mat = pointOfView.transform
    let dir = SCNVector3(-1 * mat.m31, -1 * mat.m32, -1 * mat.m33)

let currentPosition = pointOfView.position + (dir * 0.1) ------> Getting error here

    let projectedPlaneCenter = self.sceneView.projectPoint(currentPosition)
    zVal = Double(projectedPlaneCenter.z)
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
345
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Оператор * не определен для операндов SCNVector3 и Double.

Я предполагаю, что под someVector * 0.1 вы подразумеваете умножение каждого компонента вектора на 0,1?

В этом случае вы можете определить свой собственный оператор *:

// put this in the global scope
func *(lhs: SCNVector3, rhs: Double) -> SCNVector3 {
    return SCNVector3(lhs.x * CGFloat(rhs), lhs.y * CGFloat(rhs), lhs.z * CGFloat(rhs))
}

// usage
SCNVector3(1, 2, 3) * 0.1 // (0.1, 0.2, 0.3)

Вставьте это в свой проект, и он должен работать.

    public static func * (lhs: SCNVector3, rhs: Double) -> SCNVector3 {
        return SCNVector3(lhs.x * .init(rhs), lhs.y * .init(rhs), lhs.z * .init(rhs))
    }

    public static func * (lhs: Double, rhs: SCNVector3) -> SCNVector3 {
        return rhs * lhs
    }
}

Другие вопросы по теме