ごく簡単にViewModelを作ってみた。
まずモデルは
struct Article: Codable { let title:String let url:String } func fetchArticles() -> AnyPublisher<[Article], Error> { let url = URL(string: "https://qiita.com/api/v2/items")! let request = URLRequest(url:url) return URLSession.shared .dataTaskPublisher(for: request) .map({$0.data}) .decode(type: [Article].self, decoder: JSONDecoder()) .eraseToAnyPublisher() }
ViewModelはこのようにボタンタップをしたらtextが変わる形に書いておく。 ObservableObjectを継承する。
import Foundation import SwiftUI import Combine class ViewModel : ObservableObject { @Published private(set) var text: String = "Hello, World!" var cancels = [AnyCancellable]() func onTapped() { fetchArticles() .receive(on: DispatchQueue.main) .sink(receiveCompletion: {_ in }) { articles in self.text = articles.description }.store(in: &cancels) } }
ViewでViewModelをつなげる。@ObservedObjectを使う。
import SwiftUI import Combine struct ContentView: View { @ObservedObject var viewModel = ViewModel() var body: some View { VStack { Button(action: { self.viewModel.onTapped() }) { Text("Push") } Text(viewModel.text) } } }
ここではエラーについて議論していない。