Anda seharusnya tidak. Ini adalah kesalahpahaman umum bahwa SwiftUI bekerja paling baik dengan MVVM.
MVVM tidak memiliki tempat di SwfitUI. Anda bertanya apakah Anda bisa mendorong persegi panjang ke
pas bentuk segitiga. Itu tidak cocok.
Mari kita mulai dengan beberapa fakta dan bekerja selangkah demi selangkah:
ViewModel adalah model dalam MVVM.
MVVM tidak mempertimbangkan tipe nilai (misalnya; tidak ada hal seperti itu di java) yang menjadi pertimbangan.
Model tipe nilai (model tanpa negara) dianggap lebih aman daripada referensi
tipe model (model with state) dalam arti immutability.
Sekarang, MVVM mengharuskan Anda untuk mengatur model sedemikian rupa sehingga setiap kali itu berubah, itu
pembaruan melihat dalam beberapa cara yang telah ditentukan sebelumnya. Ini dikenal sebagai penjilidan.
Tanpa ikatan, Anda tidak akan memiliki pemisahan kekhawatiran yang bagus, misalnya; refactoring keluar
model dan negara terkait dan menjaga mereka terpisah dari pandangan.
Ini adalah dua hal yang gagal dilakukan sebagian besar pengembang MVVM iOS:
iOS tidak memiliki mekanisme "mengikat" dalam pengertian java tradisional.
Beberapa hanya akan mengabaikan pengikatan, dan berpikir memanggil objek ViewModel
secara otomatis memecahkan segalanya; beberapa akan memperkenalkan Rx berbasis KVO, dan
mempersulit segalanya ketika MVVM seharusnya membuat segalanya lebih sederhana.
Model dengan negara terlalu berbahaya
karena MVVM terlalu menekankan pada ViewModel, terlalu sedikit pada manajemen negara
dan disiplin umum dalam mengelola Kontrol; sebagian besar pengembang berakhir
berpikir model dengan status yang digunakan untuk memperbarui tampilan dapat digunakan kembali dan
dapat diuji .
inilah mengapa Swift memperkenalkan tipe nilai sejak awal; model tanpa
negara.
Sekarang untuk pertanyaan Anda: Anda bertanya apakah ViewModel Anda dapat memiliki akses ke EnvironmentObject (EO)?
Anda seharusnya tidak. Karena dalam SwiftUI model yang sesuai dengan Lihat secara otomatis miliki
referensi ke EO. Misalnya;
struct Model: View {
@EnvironmentObject state: State
// automatic binding in body
var body: some View {...}
}
Saya harap orang-orang dapat menghargai betapa kompaknya SDK dirancang.
Di SwiftUI, MVVM otomatis . Tidak perlu untuk objek ViewModel yang terpisah
yang secara manual mengikat untuk melihat yang memerlukan referensi EO diteruskan ke sana.
Kode di atas adalah MVVM. Misalnya; model dengan binding to view.
Tetapi karena model adalah tipe nilai, jadi alih-alih refactoring keluar model dan nyatakan sebagai
lihat model, Anda menolak kontrol (dalam ekstensi protokol, misalnya).
Ini adalah SDK resmi yang mengadaptasi pola desain ke fitur bahasa, bukan hanya
menegakkannya. Substansi melebihi bentuk.
Lihatlah solusi Anda, Anda harus menggunakan singleton yang pada dasarnya global. Kamu
harus tahu betapa berbahayanya mengakses global di mana saja tanpa perlindungan
kekekalan, yang tidak Anda miliki karena Anda harus menggunakan model tipe referensi!
TL; DR
Anda tidak melakukan MVVM dengan cara java di SwiftUI. Dan cara Swift-y untuk melakukannya tidak perlu
untuk melakukannya, itu sudah built-in.
Semoga lebih banyak pengembang melihat ini karena ini sepertinya pertanyaan yang populer.