Двоичный оператор ‘*’ не может быть применен к операндам типа ‘SCNVector3’ и ‘Double’

#ios #xcode #swift4 #arkit

#iOS #xcode #swift4 #arkit

Вопрос:

У меня есть потребность, когда я должен умножить 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)
  

пусть currentPosition = pointOfView.position (dir * 0.1) ——> Получение ошибки здесь

     let projectedPlaneCenter = self.sceneView.projectPoint(currentPosition)
    zVal = Double(projectedPlaneCenter.z)
  

Ответ №1:

Оператор * не определен для операндов 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)
  

Ответ №2:

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

     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
    }
}