ios - Cannot use instance member within property initializer -
i have checked other case on this lazy var doesn't seem fix problem here.
i have code using solve equation and, once it's solved, want return 2 arrays answers original code in viewcontroller.swift. code given below but, @ line try solve problem let (dollars1, dollars2) = prob.solveusingsolver(solver:solveeuler) line. testing in playground prob.solveusingsolver(solver:solveeuler), solved problem. but, in main application, it's giving "expected declaration" error. , if try assign outputs dollars1 , dollars2,
cannot use instance member 'prob' within property initializer; property initializers run before 'self' available
import charts class viewcontroller: uiviewcontroller, chartviewdelegate { @iboutlet weak var linechartview: linechartview! override func viewdidload() { super.viewdidload() // solving 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 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 { 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 = 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 < 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 array of data entries var yvals1 : [chartdataentry] = [chartdataentry]() in 0 ..< space_dimensionless.count { yvals1.append(chartdataentry(x: space_dimensionless[i], y: temp_hot[i])) } // 2 - create data set our array let set1: linechartdataset = linechartdataset(values: yvals1, label: "hot fluid") set1.axisdependency = .left // line correlate left axis values set1.setcolor(uicolor.red.withalphacomponent(0.5)) // our line's opacity 50% set1.setcirclecolor(uicolor.red) // our circle dark red set1.linewidth = 2.0 set1.circleradius = 0.0 // radius of node circle set1.fillalpha = 65 / 255.0 set1.fillcolor = uicolor.red set1.highlightcolor = uicolor.white set1.drawcircleholeenabled = false // 3 - creating array of data entries var yvals2 : [chartdataentry] = [chartdataentry]() in 0 ..< space_dimensionless.count { yvals2.append(chartdataentry(x: space_dimensionless[i], y: temp_cold[i])) } // 4 - create data set our array let set2: linechartdataset = linechartdataset(values: yvals2, label: "cold fluid") set2.axisdependency = .left // line correlate left axis values set2.setcolor(uicolor.blue.withalphacomponent(0.5)) // our line's opacity 50% set2.setcirclecolor(uicolor.blue) // our circle dark red set2.linewidth = 2.0 set2.circleradius = 0.0 // radius of node circle set2.fillalpha = 65 / 255.0 set2.fillcolor = uicolor.blue set2.highlightcolor = uicolor.white set2.drawcircleholeenabled = true //5 - create array 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 resources can recreated. } }
you declaring 2 properties, prob , (dollars1, dollars2) tuple
let prob = he(th1: 100.0, tc2: 25.0, deltaz: 0.1) let (dollars1, dollars2) = prob.solveusingsolver(solver:solveeuler) but cannot use member of prob (the solveusingsolver function) @ point because self.prob won't have been initialised yet.
you want tuple assignment performed in function.
update
your solveusingsolver function invokes solver doesn't return value solver. should be:
func solveusingsolver(solver: solver) -> (array<double>, array<double>) { return solver(th1, tc2, deltaz) }
Comments
Post a Comment