Я не могу получить CGFloat в структуре [CGFloat] - PullRequest
0 голосов
/ 28 февраля 2020

Привет, я студент коллажа, который сделал график, который показывает, как пользователь хорошо спит. Я получаю дату от выбора даты, и я сделал функцию, чтобы изменить дату на CGFloat. Но я не могу поместить CGFloat в структуру. Вот мой код. Я собираюсь сделать больше данных о сне как число даты месяца.

Версия XCode - 11.2.1, и я сделал заявление по swiftui

import SwiftUI

struct graph_view: View {

@State var sleepdata : [[CGFloat]] = [
    [300,205,105,0,0,105,0,205,105,105,205,105,300],
    [300,105,105,0,0,105,0,105,205,205,105,105,205],
    [205,105,105,0,105,0,0,0,105,0,205,205,300]
]

func getDate()->String{
 let datetextFormatter = DateFormatter()
    datetextFormatter.locale = Locale(identifier: "ko_KR")
    datetextFormatter.dateFormat = "YYYY년 MM월 dd일"
 let stringdate = datetextFormatter.string(from: date)
 return stringdate
}
func getDate2()->CGFloat{
    let datetextFormatter2 = DateFormatter()
    datetextFormatter2.locale = Locale(identifier:"ko_KR")
    datetextFormatter2.dateFormat = "dd"
    let stringdate2 = datetextFormatter2.string(from: date)
    let myFloat = (stringdate2 as NSString).floatValue
    return CGFloat(myFloat)
}

@State var date = Date()


var body: some View {
    ZStack{
        Form {
            Section (header: Text("\(getDate()) 그래프")){
                VStack {
                DatePicker(selection: $date, displayedComponents: .date, label: { Text("날짜 선택") })

                }

            }

        }
        VStack{
                VStack{
                HStack(){
                    VStack(alignment: .trailing){ Text("waken").font(.system(size: 10)).offset(y:-125)

                        Text("light sleep").font(.system(size: 10)).offset(y:-45)

                        Text("deep sleep").font(.system(size: 10)).offset(y:45)

                        Text("REM").font(.system(size: 10)).offset(y:125)

                    }
                    Group{
                        Bargraph(value: sleepdata[(getDate2())][0])
                        Spacer()
                        Bargraph(value: sleepdata[0][1])
                        Spacer()
                        Bargraph(value: sleepdata[0][2])
                        Spacer()
                        Bargraph(value: sleepdata[0][3])
                        Spacer()
                        Bargraph(value: sleepdata[0][4])
                        Spacer()
                        }
                }
                }.padding(.horizontal,10)
                .animation(.default)
                HStack(){
                    Text("수면").font(.system(size: 10)).offset(x:35)
                    Spacer()
                    Text("기상").font(.system(size: 10))
                }.padding(.horizontal,5)
                }
            }
        }
    }




struct Bargraph: View{

var value : CGFloat
var body: some View{
    VStack{
        ZStack(alignment: .bottom){
        Capsule().frame(width : 10, height: 300).foregroundColor(Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)))
        Capsule().frame(width : 10, height: value).foregroundColor(Color(#colorLiteral(red: 0.501960814, green: 0.501960814, blue: 0.501960814, alpha: 1)))
        }
    }
}
}

struct graph_view_Previews: PreviewProvider {
static var previews: some View {
    graph_view()
}
}

Здесь я получил сообщение об ошибке

Bargraph(value: sleepdata[(getDate2())][0])
                        Spacer()

Невозможно добавить значение типа '[[CGFloat]]' с аргументом типа 'CGFloat'

Мне просто интересно, почему я не могу использовать CGFloat в struct даже форме правильно. И я хочу знать, как это исправить или как заставить это работать. Спасибо за прочитанный вопрос начинающих. Буду очень признателен, если вы найдете решение.

1 Ответ

0 голосов
/ 28 февраля 2020

Вы должны передать Int как свой нижний индекс, потому что это требуемый синтаксис.

Как-то так ..

sleepdata[0][Int(getDate2())]

Но я думаю, что реальная проблема - ваши данные сна структура данных. Я думаю, вы должны просто объявить его как массив CGFloats, если это то, что вам нужно, а не как массив массивов CGFloats. Хотя, по общему признанию, я не знаю, что означают данные, и как вы их используете.

Как бы то ни было, нижний индекс, взятый из Int(getDate2()), вызовет ошибку «Индекс вне диапазона» для любого значения возвращается, что выше 12.

Редактировать

Я не заметил, что вы поставили 0 в качестве внутреннего индекса, поэтому исправленная форма будет:

sleepdata[Int(getDate2())][0]

Поскольку ваши данные имеют только 3 подмассива, любой нижний индекс выше 2 приведет к аналогичной ошибке.

Так что в контексте вызова гистограммы он должен работать с:

Bargraph( value: sleepdata [Int(getDate2())] [0] )

Добавлены пробелы, чтобы было понятно, как мы получаем доступ к двумерному массиву.

...