이번에는 DetatilView에서 코인에 대한 정보를 나타내는 화면을 구현합니다.
단순히 HStack으로 반복 작업해줘도 되지만,
향후 유지보수가 수월하도록 Model, ViewModel 작업을 해서 ForEach 문으로 작성했습니다.
1. StatisticModel 생성
import Foundation
struct StatisticModel: Identifiable {
let id = UUID().uuidString
let title: String
let value: String
init(title: String, value: String) {
self.title = title
self.value = value
}
}
2. StatisticView 생성
import SwiftUI
struct StatisticView: View {
let stat: StatisticModel
var body: some View {
HStack {
Text(stat.title)
.foregroundColor(Color.theme.accent)
Spacer()
Text(stat.value)
}
.padding()
}
}
3. DetailViewModel 작업
import Foundation
import Combine
class DetailViewModel: ObservableObject {
@Published var statistics: [StatisticModel] = []
@Published var coin: CoinModel
private let coinDatailSecvice: CoinDetailDataService
private var cancellables = Set<AnyCancellable>()
init(coin: CoinModel) {
self.coin = coin
self.coinDatailSecvice = CoinDetailDataService(coin: coin)
self.addSubscribers()
}
private func addSubscribers() {
$coin
.map(mapDataToStatistics)
.sink { [weak self] (returnedArrays) in
self?.statistics = returnedArrays
}
.store(in: &cancellables)
}
private func mapDataToStatistics(coinModel: CoinModel) -> [StatisticModel] {
let rank = coinModel.rank
let rankStat = StatisticModel(title: "Rank", value: "No. \(rank)")
let marketCap = coinModel.marketCap?.asCurrency() ?? ""
let marketCapStat = StatisticModel(title: "Market Cap", value: marketCap)
let circulationSupply = coinModel.circulatingSupply?.asNumberWithoutDecimal() ?? ""
let circulationSupplyStat = StatisticModel(title: "Circulation Supply", value: circulationSupply)
let maxSupply = coinModel.maxSupply?.asNumberWithoutDecimal() ?? ""
let maxSupplyStat = StatisticModel(title: "Max Supply", value: maxSupply)
let totalSupply = coinModel.totalSupply?.asNumberWithoutDecimal() ?? ""
let totalSupplyStat = StatisticModel(title: "Total Supply", value: totalSupply)
let statArray: [StatisticModel] = [
rankStat, marketCapStat, circulationSupplyStat, maxSupplyStat, totalSupplyStat
]
return statArray
}
}
5. Double 숫자를 쉼표가 있는 숫자로 변환시키기 위해서 Formatter도 몇개 추가해줬습니다.
DoubleFormatter 깃허브:
GitHub - mwoo-git/SwiftUICoin: Cloning Binance Lite with SwiftUI, Combine, MVVM
Cloning Binance Lite with SwiftUI, Combine, MVVM. Contribute to mwoo-git/SwiftUICoin development by creating an account on GitHub.
github.com
6. ForEach문으로 리스트를 만들어주는 DetailStatsView 생성
import SwiftUI
struct DetailStatsView: View {
@StateObject var viewMdoel: DetailViewModel
var body: some View {
VStack {
ForEach(viewMdoel.statistics) { stat in
StatisticView(stat: stat)
}
}
}
}
7. 완성!
DetailStatsView(viewMdoel: viewModel)
'Project > SwiftUI 블록와이드' 카테고리의 다른 글
[SwiftUI Project] NavigationView가 강제로 dismiss 되는 문제 해결 (0) | 2022.10.01 |
---|---|
[SwiftUI Project] Core Data 즐겨찾기 기능 구현하기 (0) | 2022.09.28 |
[SwiftUI Projetct] 앱에 TradingView 임배드하기 (0) | 2022.09.22 |
[SwiftUI Project] NavigationLink Lazy View 만들기 (0) | 2022.09.19 |
[SwiftUI Project] 정렬 기능 만들기 (시총, 가격순, 변동률순) with Combine (2) | 2022.09.19 |
댓글