TransWikia.com

Линейный график

Stack Overflow на русском Asked by Caleb G on November 10, 2021

Я новичок в кодировании (любом кодировании на любом языке). В настоящее время у меня есть проект, который написан в SwiftUI. Теперь мне нужно добавить линейный график к нему. Я заметил, что в большинстве учебных пособий либо говорится о создании bar-чартов (которые по какой-то странной причине являются отраслевым стандартом), либо о создании графиков в UIKit. Итак, у меня несколько вопросов:

(1) Если бы я из-за отсутствия альтернативного выбора решил сделать линейный график в UIKit, смогу ли я интегрировать его в проект SwiftUI, который у меня есть сейчас?

(2) Можно ли создать динамический линейный график, который будет извлекать данные из API и соответствующим образом обновлять диаграмму при каждом обновлении информации в API? (Под «динамической» диаграммой я имею в виду именно это … не вставлять вручную координаты x и y каждый раз [именно так я примитивно предполагаю, что это работает], а автоматически, получая данные из API).

Это вообще возможно? И если да, то где мне нужно искать, что искать, с чего бы вы посоветовали начать?

Большое спасибо заранее, будьте здоровы!

One Answer

Вот пример запроса и отображения линейного графика с помощью ChartView и сервиса для тестирования запросов https://jsonplaceholder.typicode.com. Здесь мы запрашиваем посты и отображаем в графике длину строк их заголовков

struct ContentView: View {
    
    @ObservedObject var postsDatasource = PostsDatasource()
    
    var body: some View {
        LineChartView(
            data: postsDatasource.titlesLengths,
            title: "Titles Length",
            legend: "Shows posts titles lengths",
            form: ChartForm.extraLarge,
            rateValue: 0)
            .onAppear { self.postsDatasource.fetchTitlesLengths() }
    }
    
}

Класс для запроса данных

class PostsDatasource: ObservableObject {
    
    struct Post: Decodable {
        var userId: Int
        var id: Int
        var title: String
        var body: String
    }

    var titlesLengths: [Double] = [] {
        didSet {
            objectWillChange.send()
        }
    }
    
    func fetchTitlesLengths() {
        guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts") else {
            return
        }
        
        URLSession.shared.dataTask(with: url) { (data, responce, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            
            guard let data = data else {
                print("No data")
                return
            }
            
            guard let posts = try? JSONDecoder().decode([Post].self, from: data) else {
                print("Unable to parse posts")
                return
            }
            
            DispatchQueue.main.async {
                self.titlesLengths = posts.map { Double($0.title.count) }
            }

        }.resume()
    }

}

Answered by schmidt9 on November 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP