2017-08-21 9 views
0

Ich habe die other case on this überprüft, aber faul var scheint mein Problem hier nicht zu beheben.Instanzelement in Eigenschaftsinitialisierer kann nicht verwendet werden

Ich habe diesen Code, den ich verwende, um eine bestimmte Gleichung zu lösen und, sobald es gelöst ist, möchte ich die 2 Arrays zurückgeben, die ich als Antworten zurück zu meinem ursprünglichen Code in ViewController.swift. Der Code ist unten, aber an der Linie, wo ich versuche, das Problem mit let (dollars1, dollars2) = prob.solveUsingSolver(solver:solveEuler) Linie tatsächlich zu lösen. Ich habe es zuerst auf dem Spielplatz mit nur prob.solveUsingSolver(solver:solveEuler) getestet, die das Problem gelöst hat. In der Hauptanwendung gibt es jedoch einen Fehler "Erwartete Deklaration". Und wenn ich versuche, um die Ausgänge zu dollars1 und dollars2 zuweisen, erhalte ich die

nicht Instanz Mitglied ‚prob‘ im Eigentum initializer verwenden kann; Eigenschaft Initialisierungen vor ‚Selbst‘ laufen ist verfügbar

import Charts 
class ViewController: UIViewController, ChartViewDelegate { 
    @IBOutlet weak var lineChartView: LineChartView! 
    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     // Solving the problem 
     let wholearray = HE(Th1: 100.0, Tc2: 25.0, deltaZ: 0.1).solveUsingSolver(solver:solveEuler) 
     let temp_hot = wholearray.xarray 
     let temp_cold = wholearray.varray 
     // 1 
     self.lineChartView.delegate = self 
     // 2 
     self.lineChartView.chartDescription?.text = "Tap node for details" 
     // 3 
     self.lineChartView.descriptionTextColor = UIColor.white 
     self.lineChartView.gridBackgroundColor = UIColor.darkGray 
     // 4 
     self.lineChartView.noDataText = "No data provided" 
     // 5 
     setChartData(space_dimensionless: space_dimensionless) 
    } 
    let space_dimensionless = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] 
    typealias Solver = (Double, Double, Double) -> (Array<Double>, Array<Double>) 
    struct HE { 
     var Th1 = 0.0 
     var Tc2 = 0.0 
     var deltaZ = 0.0 
     init(Th1: Double, Tc2: Double, deltaZ: Double) { 
      self.Th1 = Th1 
      self.Tc2 = Tc2 
      self.deltaZ = deltaZ 
     } 
     func solveUsingSolver(solver: Solver) { 
      solver(Th1, Tc2, deltaZ) 
     } 
    } 
    func solveEuler(Th1: Double, Tc2: Double, z : Double) -> (xarray:Array<Double>, varray:Array<Double>) 
    { 
     var x = Th1 
     var i = 0.0 
     var upper = Th1 
     var lower = Tc2 
     var vold = (lower + upper)/2 
     var v = vold 
     var xold = x 
     let epsilon = 0.05 
     var err = 1.0 
     var xarray: [Double] = [0,1,2,3,4,5,6,7,8,9,10] 
     var varray: [Double] = [0,1,2,3,4,5,6,7,8,9,10] 
     var j=0 
     while (err > epsilon) { 
      while i < 1 { 
       v -= 4*z*i*(xold-vold) 
       x -= z*i*(xold-vold) 
       xold = x 
       vold = v 
       i+=z 
       xarray[j]=x 
       varray[j]=v 
       j += 1 
      } 
      err = abs(varray[10] - Tc2) 
      if varray[10] > Tc2 { 
       upper = varray[0] 
      } 
      else { 
       lower = varray[0] 
      } 
      x = Th1 
      xold = x 
      vold = (lower + upper)/2 
      v = vold 
      i=0.0 
      j=0 
     } 
     return (xarray,varray) 
    } 
    func setChartData(space_dimensionless : [Double]) { 
     // 1 - creating an array of data entries 
     var yVals1 : [ChartDataEntry] = [ChartDataEntry]() 
     for i in 0 ..< space_dimensionless.count { 
      yVals1.append(ChartDataEntry(x: space_dimensionless[i], y: temp_hot[i])) 
     } 
     // 2 - create a data set with our array 
     let set1: LineChartDataSet = LineChartDataSet(values: yVals1, label: "Hot Fluid") 
     set1.axisDependency = .left // Line will correlate with left axis values 
     set1.setColor(UIColor.red.withAlphaComponent(0.5)) // our line's opacity is 50% 
     set1.setCircleColor(UIColor.red) // our circle will be dark red 
     set1.lineWidth = 2.0 
     set1.circleRadius = 0.0 // the radius of the node circle 
     set1.fillAlpha = 65/255.0 
     set1.fillColor = UIColor.red 
     set1.highlightColor = UIColor.white 
     set1.drawCircleHoleEnabled = false 
     // 3 - creating an array of data entries 
     var yVals2 : [ChartDataEntry] = [ChartDataEntry]() 
     for i in 0 ..< space_dimensionless.count { 
      yVals2.append(ChartDataEntry(x: space_dimensionless[i], y: temp_cold[i])) 
     } 
     // 4 - create a data set with our array 
     let set2: LineChartDataSet = LineChartDataSet(values: yVals2, label: "Cold Fluid") 
     set2.axisDependency = .left // Line will correlate with left axis values 
     set2.setColor(UIColor.blue.withAlphaComponent(0.5)) // our line's opacity is 50% 
     set2.setCircleColor(UIColor.blue) // our circle will be dark red 
     set2.lineWidth = 2.0 
     set2.circleRadius = 0.0 // the radius of the node circle 
     set2.fillAlpha = 65/255.0 
     set2.fillColor = UIColor.blue 
     set2.highlightColor = UIColor.white 
     set2.drawCircleHoleEnabled = true 
     //5 - create an array to store our LineChartDataSets 
     var dataSets = [IChartDataSet]() 
     dataSets.append(set1) 
     dataSets.append(set2) 
     let lineChartData = LineChartData(dataSets: dataSets) 
     //6 - set our data 
     lineChartView.data = lineChartData 
     //7 Format chart more 
     self.lineChartView.xAxis.drawGridLinesEnabled = false 
     self.lineChartView.xAxis.labelPosition = XAxis.LabelPosition.bottom 
     self.lineChartView.xAxis.labelFont = UIFont(name: "HelveticaNeue-Light", size: 10.0)! 
     self.lineChartView.xAxis.labelTextColor = UIColor.black 
     self.lineChartView.xAxis.drawAxisLineEnabled=true 
    } 
    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

Antwort

1

erklären Sie, zwei Eigenschaften, prob und die (dollars1, dollars2) Tupel

let prob = HE(Th1: 100.0, Tc2: 25.0, deltaZ: 0.1) 
let (dollars1, dollars2) = prob.solveUsingSolver(solver:solveEuler) 

aber man kann nicht ein Mitglied von prob (die solveUsingSolver-Funktion) verwenden, um dieser Punkt, weil self.prob noch nicht initialisiert worden ist.

Wahrscheinlich möchten Sie, dass die Tupelzuweisung in einer Funktion ausgeführt wird.

UPDATE

Ihre solveUsingSolver Funktion ruft die solver aber den Wert aus dem Solver nicht zurück. Es sollte sein:

func solveUsingSolver(solver: Solver) -> (Array<Double>, Array<Double>) { 
    return solver(Th1, Tc2, deltaZ) 
} 
+0

Ich dachte daran, aber ich brauche die Tupel außerhalb der Funktion. Versucht, 'return' zu verwenden, aber es konnte nicht funktionieren. –

+0

Ich weiß nicht, was ich dazu sagen soll. Sie können nicht den Code haben, wo Sie es haben. Vielleicht bearbeiten Sie Ihre Frage, um den Code hinzuzufügen, den Sie ausprobiert haben. – Paulw11

+0

Überprüfen Sie jetzt. Das Hauptproblem ist die Löserzeile oben, 'leet wholearray = HE (Th1: 100.0, Tc2: 25.0, deltaZ: 0.1) .solveUsingSolver (Löser: solveEuler)', gibt ein leeres Array zurück, weil es sagt, dass es zurückkehrt '()', was unerwartet ist. Wenn ich während des Testens das gleiche auf dem Spielplatz machte, ohne es etwas zuzuordnen, d. H. HE (Th1: 100.0, Tc2: 25.0, deltaZ: 0.1) .solveUsingSolver (solver: solveEuler) ', löste es das gut. Das Problem ist hier in der eigentlichen Anwendung. –

Verwandte Themen