Rodhos Soft

備忘録を兼ねた技術的なメモです。Rofhos SoftではiOSアプリ開発を中心としてAndroid, Webサービス等の開発を承っております。まずはご相談下さい。

簡単なViewModel

ごく簡単に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)
        }
    }
}

ここではエラーについて議論していない。