Correct way to declare variable that loads data from CSV file

Dear all

I am relatively new to swift development.

Here is a code snippet that tries to create a controller and data model variables that dynamically load data from a CSV file. I do have model data as a data model and CSV files of data belonging to each month. I have to load 3 of them once the class load and during usage loads others. Such as initial load (*11, 10, 9) then (*10, 9, 8), etc. The code works all right, but when I use the mergedData inside viewDidLoad() the loading from the CSV process repeats 3 times. I don't know what causes this extra loading.

Am I declaring the variables wrong?

class TestController: UIViewController,  UIViewControllerTransitioningDelegate {
   
  private var _data3Year: Int = 0
  var data3Year: Int {
    get {
      let year = Calendar.current.component(.year, from: Date())
      //return year
      _data3Year = 2021
      return _data3Year
    }
    set {
      _data3Year = newValue
    }
  }
   
  var data3Month: Int = 11
   
  private var _data2Year: Int = 0
  var data2Year: Int {
    get {
      let year = Calendar.current.component(.year, from: Date())
      //return year
      _data2Year = 2021
      return _data2Year
    }
    set {
      _data2Year = newValue
    }
  }
   
  var data2Month: Int = 10
   
  private var _data1Year: Int = 0
  var data1Year: Int{
    get {
      if data2Month == 1 {
        _data1Year = data2Year - 1
        return _data1Year
         
      }
      else{
        _data1Year = data2Year
        return _data1Year
      }
    }
    set{
      _data1Year = newValue
    }
  }

  var data1Month: Int = 9
   
  var _data1:[ModelData] = []
   
  var data1:[ModelData] {
    get {
      let data1YearString = String(data1Year)
      var data1MonthString = ""
      if (data1Month < 10){
        data1MonthString = "0"+String(data1Month)
      }
      else{
        data1MonthString = String(data1Month)
      }
      let _data1:[ModelData] = loadCSV(from: String(modelID)+"-"+data1YearString+data1MonthString)
      return _data1
    }
    set {
      _data1 = newValue
    }
  }
   
  private var _data2:[ModelData] = []
   
  var data2:[ModelData] {
    get {
      let data2YearString = String(data2Year)
      var data2MonthString = ""
      if (data2Month < 10){
        data2MonthString = "0"+String(data2Month)
      }
      else{
        data2MonthString = String(data2Month)
      }
      let _data2:[ModelData] = loadCSV(from: String(modelID)+"-"+data2YearString+data2MonthString)
      return _data2
    }
    set{
      _data2 = newValue
    }
  }
   
  private var _data3:[ModelData] = []
   
  var data3:[ModelData] {
    get {
      let data3YearString = String(data3Year)
      var data3MonthString = ""
      if (data3Month < 10){
        data3MonthString = "0"+String(data3Month)
      }
      else{
        data3MonthString = String(data3Month)
      }
      let _data3:[ModelData] = loadCSV(from: String(modelID)+"-"+data3YearString+data3MonthString)
      return _data3
    }
    set{
      _data3 = newValue
    }
  }
   
  private var _mergedData:[ModelData] = []
  var mergedData:[ModelData] {
    get {
      var merged_data:[ModelData] = []
      merged_data = data1 + data2 + data3
      return merged_data
    }
    set {
      _mergedData = newValue
    }
  }
   
  
 override func viewDidLoad() {
    
   super.viewDidLoad()
   mergedData .....    

 }

in mergedData, you have:

      merged_data = data1 + data2 + data3

Each time you access data1 or data2 or data3, you call loadCSV. Hence you call 3 times.

Why do you have 2 var : data1 and _data1 ?

Why not remove _data1, declare

var data1:[ModelData] = []

And load data1, data2, data3 in viewDidLoad:

      let data1YearString = String(data1Year)
      var data1MonthString = ""
      if (data1Month < 10){
        data1MonthString = "0"+String(data1Month)
      }
      else{
        data1MonthString = String(data1Month)
      }
      data1= loadCSV(from: String(modelID)+"-"+data1YearString+data1MonthString)

And the same for all other var.

Correct way to declare variable that loads data from CSV file
 
 
Q