Creating a data model and View to display market statistics | SwiftUI Crypto App #12
@Published var statistics: [StatisticModel] = [
StatisticModel(title: "Title", value: "Value", percentageChange: 1),
StatisticModel(title: "Title", value: "Value"),
StatisticModel(title: "Title", value: "Value"),
StatisticModel(title: "Title", value: "Value", percentageChange: -10)
]
struct HomeStatsView: View {
@EnvironmentObject private var viewModel: HomeViewModel
@Binding var showPortfolio: Bool
var body: some View {
HStack {
ForEach(viewModel.statistics) { stat in
StatisticView(stat: stat)
.frame(width: UIScreen.main.bounds.width / 3)
}
}
.frame(width: UIScreen.main.bounds.width, alignment: showPortfolio ? .trailing : .leading)
}
}
EnvironmentObject
로 받고 있기 때문에 접근 가능statistics
를 통해 수평 리스트 UI 패치 가능import Foundation
struct StatisticModel: Identifiable {
let id = UUID().uuidString
let title: String
let value: String
let percentageChange: Double?
init(title: String, value: String, percentageChange: Double? = nil) {
self.title = title
self.value = value
self.percentageChange = percentageChange
}
}
List
의 아이덴티파이어로 주기 위해 Identifiable
프로토콜import SwiftUI
struct StatisticView: View {
let stat: StatisticModel
var body: some View {
VStack(alignment: .leading, spacing: 4) {
Text(stat.title)
.font(.caption)
.foregroundColor(Color.theme.secondaryText)
Text(stat.value)
.font(.headline)
.foregroundColor(Color.theme.accent)
HStack(spacing: 4) {
Image(systemName: "triangle.fill")
.font(.caption2)
.rotationEffect(
Angle(degrees: (stat.percentageChange ?? 0) >= 0 ? 0 : 180))
Text(stat.percentageChange?.asPercentString() ?? "")
.font(.caption)
.bold()
}
.foregroundColor(stat.percentageChange ?? 0 >= 0 ? Color.theme.green : Color.theme.red)
.opacity(stat.percentageChange == nil ? 0.0 : 1.0)
}
}
}
import SwiftUI
struct HomeStatsView: View {
@EnvironmentObject private var viewModel: HomeViewModel
@Binding var showPortfolio: Bool
var body: some View {
HStack {
ForEach(viewModel.statistics) { stat in
StatisticView(stat: stat)
.frame(width: UIScreen.main.bounds.width / 3)
}
}
.frame(width: UIScreen.main.bounds.width, alignment: showPortfolio ? .trailing : .leading)
}
}
HomeStatsView(showPortfolio: $showPortfolio)
HomeStatsView
를 호출하는 코드showPortfolio
프로퍼티를 바인딩