Сохранение данных Firebase в виде массива, а затем использование этого массива для создания круговой диаграммы - PullRequest
0 голосов
/ 31 января 2019

Я получаю данные из Firebase, а затем храню их в массивах.Затем я пытаюсь использовать эти массивы с библиотекой iOS Charts.Однако я получаю следующие ошибки:

Невозможно присвоить значение типа 'charts2Model' для типа 'Double' Невозможно присвоить значение типа 'chartsModel' для типа 'String?'

Две функциикак показано ниже:

// Мои модели следующие:

    class chartsModel {

var FullName: String?

init(FullName: String?){
    self.FullName = FullName

}
    }

// и:

    class charts2Model {

var Opened: Double?

init(Opened: Double?){
    self.Opened = Opened
}
    }

// Я объявил массивы следующим образом:

    var chartArray = [chartsModel]()
    var chartArray2 = [charts2Model]()

// Первая функция получает данные из Firebase и сохраняет значения в соответствующих им массивах.

func chartDataFromFB(){

    databaseReference = Database.database().reference()


    let refChallenges = Database.database().reference(withPath: "Users")

    refChallenges.observeSingleEvent(of: .value, with: {  (snapshot) in

        //if the reference have some values
        if snapshot.childrenCount > 0 {

            chartArray.removeAll()

            //iterating through all the values
            for Challenges in snapshot.children.allObjects as! [DataSnapshot] {
                //getting values
                let challengeObject = Challenges.value as? [String: AnyObject]
                let FirstName  = challengeObject?["FirstName"]
                let Opened  = challengeObject?["Opened"]

                let chartsObject = chartsModel(FullName: FirstName as! String?)

                chartArray.append(chartsObject)

                let chartsObject2 = charts2Model(Opened: Opened as! Double?)

                chartArray2.append(chartsObject2)

            }

        }

    })

}

// Вторая функция является частичной, и что я 'Я пытаюсь использовать для создания круговой диаграммы:

func makeChart(){

    let chart = PieChartView(frame: self.view.frame)


    var entries = [PieChartDataEntry]()
    for (index, value) in chartArray2.enumerated() {
        let entry = PieChartDataEntry()
        entry.y = value
        entry.label = chartArray[index]
        entries.append( entry)
      }
    }

Я получаю ошибки в следующих строках:

    entry.y = value
    entry.label = chartArray[index]

Я надеюсь, что смогу избавиться от двухошибки и заставить мой график работать.Заранее спасибо.

1 Ответ

0 голосов
/ 31 января 2019

Ваш chartArray и chartArray2 содержат элементы charModel и chart2Model.

Вам необходимо получить доступ к их атрибуту FullName и Opened.

Итак, измените это:

 entry.y = value
 entry.label = chartArray[index]

наэто:

 entry.y = value.Opened!
 entry.label = chartArray[index].FullName!

Некоторые советы :

  1. Имя класса обычно пишется с большой буквы: chartModel -> ChartModel, этоне является обязательным, но это хорошая практика
  2. Имя атрибута класса: camelCase: FullName -> fullName, как указано выше
  3. Не приводить к необязательному: as!Строка?-> как!Строка
  4. Хорошей практикой всегда является проверка опций: Пример: entry.y = value.Opened!должно быть if let v = value.Opened{ entry.y = v } И так для всех других опций
  5. Хорошей практикой является инкапсуляция атрибута класса и использование вычисляемого свойства для доступа к ним или получения / установки функций
...