编辑代码

import SwiftUI

// 表示平面上的点
class Point {
    var x: Double
    var y: Double
    
    init(x: Double, y: Double) {
        self.x = x
        self.y = y
    }
}

// 表示向量的类
class MyVector {
    var startPoint: Point
    var endPoint: Point
    
    init(startPoint: Point, endPoint: Point) {
        self.startPoint = startPoint
        self.endPoint = endPoint
    }
    
    // 向量加法
    static func + (lhs: MyVector, rhs: MyVector) -> MyVector {
        let newEndPoint = Point(x: lhs.endPoint.x + rhs.endPoint.x - lhs.startPoint.x,
                                y: lhs.endPoint.y + rhs.endPoint.y - lhs.startPoint.y)
        return MyVector(startPoint: lhs.startPoint, endPoint: newEndPoint)
    }
    
    // 向量减法
    static func - (lhs: MyVector, rhs: MyVector) -> MyVector {
        let newEndPoint = Point(x: lhs.endPoint.x - rhs.endPoint.x - lhs.startPoint.x,
                                y: lhs.endPoint.y - rhs.endPoint.y - lhs.startPoint.y)
        return MyVector(startPoint: lhs.startPoint, endPoint: newEndPoint)
    }
    
    // 向量的模
    func magnitude() -> Double {
        let dx = endPoint.x - startPoint.x
        let dy = endPoint.y - startPoint.y
        return sqrt(dx * dx + dy * dy)
    }
    
    // 向量乘法
    static func * (lhs: MyVector, rhs: MyVector) -> Double {
        let dx1 = lhs.endPoint.x - lhs.startPoint.x
        let dy1 = lhs.endPoint.y - lhs.startPoint.y
        let dx2 = rhs.endPoint.x - rhs.startPoint.x
        let dy2 = rhs.endPoint.y - rhs.startPoint.y
        return dx1 * dx2 + dy1 * dy2
    }
}

struct ContentView: View {
    @State private var inputText = ""
    @State private var resultText = ""
    
    var body: some View {
        VStack {
            TextField("Enter vector (e.g., (1,2)+(3,4))", text: $inputText)
                .padding()
                .textFieldStyle(RoundedBorderTextFieldStyle())
            
            Button("Calculate") {
                resultText = calculateVector()
            }
            .padding()
            
            Text("Result: \(resultText)")
                .padding()
        }
        .padding()
    }
    
    func calculateVector() -> String {
        // 解析用户输入,创建两个向量
        let vectors = inputText.components(separatedBy: CharacterSet(charactersIn: "+-*/"))
        if vectors.count == 2, let vector1 = parseVector(vectors[0]), let vector2 = parseVector(vectors[1]) {
            // 根据用户选择的运算符,执行相应的操作
            if inputText.contains("+") {
                return (vector1 + vector2).description
            } else if inputText.contains("-") {
                return (vector1 - vector2).description
            } else if inputText.contains("*") {
                return "\(vector1 * vector2)"
            } else {
                return "\(vector1.magnitude())"
            }
        } else {
            return "Invalid input"
        }
    }
    
    func parseVector(_ vectorString: String) -> MyVector? {
        let components = vectorString.components(separatedBy: CharacterSet(charactersIn: "(,)"))
        if components.count == 5,
           let x1 = Double(components[1]),
           let y1 = Double(components[3]),
           let x2 = Double(components[2]),
           let y2 = Double(components[4]) {
            return MyVector(startPoint: Point(x: x1, y: y1), endPoint: Point(x: x2, y: y2))
        } else {
            return nil
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

@main
struct VectorCalculatorApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}