2017-08-21 16 views
0

other case on thisを確認しましたが、遅延型varはここで問題を解決していないようです。プロパティ初期化子内でインスタンスメンバーを使用できません

私はある種の方程式を解くために使用しています。一度解けば、私は元のコードViewController.swiftに戻って2つの配列を返したいと思います。コードは以下に示されていますが、私が実際にlet (dollars1, dollars2) = prob.solveUsingSolver(solver:solveEuler)行で問題を解決しようとしている行にあります。私は当初、問題を解決したちょうどprob.solveUsingSolver(solver:solveEuler)で遊び場でそれをテストしていました。しかし、主なアプリケーションでは、 "Expected declaration"エラーが出ています。私はdollars1dollars2に出力を割り当てるようにしようと、私が手

プロパティ初期化子内のインスタンスメンバ「PROB」を使用することはできません。 「自己」の前に実行プロパティ初期化子が可能です

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

答えて

1

次の2つのプロパティ、prob(dollars1, dollars2)タプル

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

を宣言しているが、あなたはprobsolveUsingSolver機能)のメンバーを使用することはできませんでself.probがまだ初期化されていないためです。

おそらく、タプルの割り当てを一部の機能で実行する必要があります。

UPDATE

あなたsolveUsingSolver機能はsolverを呼び出しますが、ソルバーから値を返しません。それはする必要があります:

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

私はそれを考えましたが、私は関数外のタプルが必要です。いくつかの点で 'return'を使って試しましたが、動作させることができませんでした。 –

+0

私はそれに何を言うべきか分かりません。あなたが持っている場所にコードを置くことはできません。多分あなたの質問を編集して、あなたが試したコードを追加してください。 – Paulw11

+0

今すぐ確認してください。主な問題は、上に近づいてくるソルバーラインです。let wholearray = HE(Th1:100.0、Tc2:25.0、deltaZ:0.1).solveUsingSolver(solver:solveEuler) 'は空の配列を返します。 '()'は予期しないものです。テスト中に同じことを 'HE(Th1:100.0、Tc2:25.0、deltaZ:0.1).solveUsingSolver(solver:solveEuler)'に割り当てずにプレイグラウンドで実行したときに、問題は解決しました。問題は実際のアプリケーションにあります。 –

関連する問題