Swift - 新手问题。在不同的文件、函数和视图之间传递变量值

Swift - Newbie question. Passing variable values between different files, functions and views

这里的新手 swift 程序员需要一些可能微不足道的帮助...

这是在不同的文件中,不同的视图:

class CanvasContainerView: UIView {
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
   
    // here are all of the calculations that lead to scoreString being calculated..

        var scoreString = round(1000 * accuracyTotal / angleTotal)
        }
//lots of other code
}

我需要我计算的“scoreString”的值可以在不同的文件、不同的控制器中访问。如果我使用 TouchesMoved 函数,我如何传递这个值?下面是我如何尝试在不同的文件中实现它,但由于范围内没有“scoreString”而惨遭失败:

import UIKit

class CanvasMainViewController: UIViewController {

    @IBOutlet weak var ScoreText: UITextField!
 
    /// Prepare the drawing canvas.
    /// - Tag: CanvasMainViewController-viewDidLoad
    override func viewDidLoad() {
        
        super.viewDidLoad()
        ScoreText.text = "\(CanvasContainerView.touchesMoved(scoreString))"
}
//lots of code
}

最后我希望我的分数显示在屏幕顶部:

所以我知道 Stack 上已经有这样的问题,但我的问题具体是我使用这个“touchesMoved”覆盖函数,它不会让我 return 任何值。它大喊它需要 void return 类型。

如有任何帮助,我将不胜感激。

显然在文件顶部声明的 var 前面添加 public 解决了问题。感谢您参与尝试帮助我。

使用委托是个好方法:

// the protocol (ie the method called by container view in the controller)
protocol CanvasContainerViewDelegate {
    func scoreUpdate(fromView view:CanvasContainerView, newScore: Double)
}

class CanvasContainerView: UIView {
    // the delegate that will be called
    var delegate: CanvasContainerViewDelegate?
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
   
    // here are all of the calculations that lead to scoreString being calculated..

        var scoreString = round(1000 * accuracyTotal / angleTotal)
        // Telling the delegate the new score value
        delegate?.scoreUpdate(fromView: self, newScore: scoreString)
        }
//lots of other code
}

class CanvasMainViewController: UIViewController, CanvasContainerViewDelegate {
    
    @IBOutlet weak var ScoreText: UITextField!
    @IBOutlet weak var containerView: CanvasContainerView!
    
    /// Prepare the drawing canvas.
    /// - Tag: CanvasMainViewController-viewDidLoad
    override func viewDidLoad() {
        
        super.viewDidLoad()
        // set the controller as a delegate of the view
        containerView.delegate = self
    }
    
    // Update the score (called by the view)
    func scoreUpdate(fromView view: CanvasContainerView, newScore: Double) {
        ScoreText.text = "\(newScore)"
    }
    
    
    //lots of code
}