【问题标题】:How to use functions from other swift files (same target) in same project如何在同一项目中使用其他 swift 文件(相同目标)中的函数
【发布时间】:2019-06-05 22:00:44
【问题描述】:

嘿,我在自己的 swift 文件中有 2 个类。我基本上这样做只是为了在我的 Viewcontroller 中获得更好的概览。不过,我需要访问数据或从我的视图 controller.swift 文件中的其他文件调用函数。它在同一个目标中,所以我不需要在我的视图控制器文件中导入它吗?

如果我确实覆盖了 func viewDidLoad() 我会得到一个异常,所以我想我只能执行一次(-> 在我的 viewController.swift 中)

//ViewController.swift

class ViewController: UIViewController{


    @IBOutlet weak var xMotion: UILabel!
    @IBOutlet weak var yMotion: UILabel!
    @IBOutlet weak var zMotion: UILabel!

    @IBOutlet weak var lineChartView: LineChartView!
    @IBOutlet weak var lineChartView2: LineChartView!


override func viewDidLoad() {
    super.viewDidLoad()

       timebuffer.append(Double(ts1))
       colors.append(UIColor.red)

       Graphen.customizeChart(values: buffer1.map { Double($0) })
       Graphen.filteredChart(values: buffer2.map { Double($0) })
       Graphen.multipleCharts()
}

//Graphen.swift

class Graphen : ViewController
{

    //creates Plot with specific numbers/data
    func customizeChart(values: [Double]){
        var dataEntries: [ChartDataEntry] = []
        for i in 0..<buffer1.count{//dataPoints.count
            let dataEntry = ChartDataEntry(x: Double(i), y: values[i])
            dataEntries.append(dataEntry) }
        lineChartDataSet = LineChartDataSet(entries: dataEntries, label: nil)
        lineChartDataSet.circleRadius = 0.5
        let lineChartData = LineChartData(dataSet: lineChartDataSet)
        self.lineChartView.data = lineChartData
    }
}

【问题讨论】:

  • 不确定 Graphen 是什么,但我觉得它不应该从 ViewController 继承,因为它更像是一个辅助类(?)并且在你的 viewDidLoad 方法中你需要创建一个实例在致电customizeChart() 之前使用 Graphen。也许你甚至应该在 ViewController 中拥有 Graphen 类型的属性
  • Graphen.swift 如果我在文件中声明了一个在 LineChartView 中绘制图表的函数。我想在 Graphen.swift 中声明并在 ViewController.swift 中使用它,例如 Graphen.[nameOfFunc] 例如 customizeChart.
  • 就像我说的,它不应该是一个子类

标签: swift file


【解决方案1】:

viewDidLoad()lifecycle methodUIViewController's instance。因此,每个UIViewCiontrollersubclass中可以是overridden,即

class ViewController: UIViewController{
    override func viewDidLoad() {
        super.viewDidLoad()
        //your code here...
    }
}


class Graphen : ViewController
{
    override func viewDidLoad() {
        super.viewDidLoad()
        //your code here...
    }
}

现在,您无需导入任何file/class,只要它们在同一个target 中即可。

现在,由于Graphen'scustomizeChart(values:)方法是instance method,所以你需要先创建Grapheninstance,然后用它来调用它的实例方法,像这样,

let graphen = Graphen()
graphen.customizeChart(values: buffer1.map { Double($0) })

类似地调用Graphen 中的其他instance methods。假设filteredChart(values:)multipleCharts() 也是instance methods,你可以像这样调用它们,

graphen.filteredChart(values: buffer2.map { Double($0) })
graphen.multipleCharts()

【讨论】:

  • let graphen = Graphen(),如果您在ViewController 类中执行此操作,那么您就是在超类中创建子类的实例,这没有任何意义,对吧?
  • 对。我刚刚解释了我们如何在任何地方使用Graphen,而不仅仅是在ViewController。此外,我们不知道问题的确切用例
  • 但是 Graphen 一个 UIViewController 的子类,你通常会在你的代码中将它们实例化为其他类吗?
  • 不是吗?何时以编程方式而不是使用情节提要?
  • 我知道这和这里讨论的用例几乎不一样。
猜你喜欢
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多